C# 我如何重构这段C代码以使其更易于阅读?
这是我的一个控制器中的一个动作——在整个项目中,我的控制器中都有类似的大型方法 我正在努力学习把这些东西放在哪里以及如何清理。我是新手,如果我看到一个关于如何更改我自己的一些代码的好例子,它可能会教我如何对大量代码进行更改 以下是我的行动:C# 我如何重构这段C代码以使其更易于阅读?,c#,asp.net-mvc-3,refactoring,C#,Asp.net Mvc 3,Refactoring,这是我的一个控制器中的一个动作——在整个项目中,我的控制器中都有类似的大型方法 我正在努力学习把这些东西放在哪里以及如何清理。我是新手,如果我看到一个关于如何更改我自己的一些代码的好例子,它可能会教我如何对大量代码进行更改 以下是我的行动: public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page) { ViewBag.CurrentSort = sor
public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.TitleSortParm = String.IsNullOrEmpty(sortOrder) ? "Title desc" : "";
ViewBag.CreditsSortParm = sortOrder == "Credits" ? "Credits desc" : "Credits";
ViewBag.ElectiveSortParm = sortOrder == "Elective" ? "Elective desc" : "Elective";
ViewBag.InstructorSortParm = sortOrder == "Instructor" ? "Instructor desc" : "Instructor";
ViewBag.YearSortParm = sortOrder == "Year" ? "Year desc" : "Year";
ViewBag.AttendingDaysSortParm = sortOrder == "AttendingDays" ? "AttendingDays desc" : "AttendingDays";
ViewBag.AttendanceCapSortParm = sortOrder == "AttendanceCap" ? "AttendanceCap desc" : "AttendanceCap";
ViewBag.StartDateSortParm = sortOrder == "StartDate" ? "StartDate desc" : "StartDate";
ViewBag.LocationSortParm = sortOrder == "Location" ? "Location desc" : "Location";
ViewBag.ParishSortParm = sortOrder == "Parish" ? "Parish desc" : "Parish";
ViewBag.DescriptionSortParm = sortOrder == "Description" ? "Description desc" : "Description";
ViewBag.ApprovedSortPArm = sortOrder == "Approved" ? "Approved desc" : "Approved";
ViewBag.CompletedSortPArm = sortOrder == "Completed" ? "Completed desc" : "Completed";
ViewBag.ArchivedSortPArm = sortOrder == "Archived" ? "Archived desc" : "Archived";
if (Request.HttpMethod == "GET")
{
searchString = currentFilter;
}
else
{
page = 1;
}
ViewBag.CurrentFilter = searchString;
var courses = from s in db.Courses
select s;
if (!String.IsNullOrEmpty(searchString))
{
courses = courses.Where(s => s.Title.ToUpper().Contains(searchString.ToUpper()));
}
switch (sortOrder)
{
case "Title desc":
courses = courses.OrderByDescending(s => s.Title);
break;
case "Credits":
courses = courses.OrderBy(s => s.Credits);
break;
case "Credits desc":
courses = courses.OrderByDescending(s => s.Credits);
break;
case "Elective":
courses = courses.OrderBy(s => s.Credits);
break;
case "Elective desc":
courses = courses.OrderByDescending(s => s.Credits);
break;
case "Instructor":
courses = courses.OrderBy(s => s.Instructor.LastName);
break;
case "Instructor desc":
courses = courses.OrderByDescending(s => s.Instructor.LastName);
break;
case "Year":
courses = courses.OrderBy(s => s.Year);
break;
case "Year desc":
courses = courses.OrderByDescending(s => s.Year);
break;
case "AttendingDays":
courses = courses.OrderBy(s => s.AttendingDays);
break;
case "AttendingDays desc":
courses = courses.OrderByDescending(s => s.AttendingDays);
break;
case "AttendanceCap":
courses = courses.OrderBy(s => s.AttendanceCap);
break;
case "AttendanceCap desc":
courses = courses.OrderByDescending(s => s.AttendanceCap);
break;
case "StartDate":
courses = courses.OrderBy(s => s.StartDate);
break;
case "StartDate desc":
courses = courses.OrderByDescending(s => s.StartDate);
break;
case "Location":
courses = courses.OrderBy(s => s.Location);
break;
case "Location desc":
courses = courses.OrderByDescending(s => s.Location);
break;
case "Parish":
courses = courses.OrderBy(s => s.Parish);
break;
case "Parish desc":
courses = courses.OrderByDescending(s => s.Parish);
break;
case "Description":
courses = courses.OrderBy(s => s.Description);
break;
case "Description desc":
courses = courses.OrderByDescending(s => s.Description);
break;
case "Approved":
courses = courses.OrderBy(s => s.Approved);
break;
case "Approved desc":
courses = courses.OrderByDescending(s => s.Approved);
break;
case "Completed":
courses = courses.OrderBy(s => s.Completed);
break;
case "Completed desc":
courses = courses.OrderByDescending(s => s.Completed);
break;
case "Archived":
courses = courses.OrderBy(s => s.Archived);
break;
case "Archived desc":
courses = courses.OrderByDescending(s => s.Archived);
break;
default:
courses = courses.OrderBy(s => s.Title);
break;
}
int pageSize = 4;
int pageNumber = (page ?? 1);
return View(courses.ToPagedList(pageNumber, pageSize));
}
我应该如何处理上述代码以使其更具可读性?我是否只是将它的一部分作为单独的方法移出,然后将它们移动到控制器的底部?我是否将这些方法放在另一个文件的某个地方并在这里引用它
请记住,我正在学习,清晰性很好。您如何更改代码纯粹是主观的,这是一个创造性的过程,您需要体验并努力成为一名更好的开发人员 但作为一个伪代码示例,目标是使方法变小。不,真的,甚至更小 使函数名非常有意义,并确保它们告诉程序员方法的真正意图。这只是一个结构示例:
public class Something {
public ActionResult Index() {
MakeCallToFunction();
var something = GetSomething();
var somethingElse = GetSomethingElse(something);
var model = new SomeViewModel(somethingElse);
return View(model);
}
private void MakeCallToFunction () {
...
}
private string GetSomething() {
...
return someVal;
}
private SomeObject GetSomethingElse(string something) {
...
return someBigObject;
}
}
或者它可能意味着你接受所有这些小函数并创建一个类
public class Something {
public ActionResult Index(int id) {
var model = new SomeRelatedStuff.Load(id);
return View(model);
}
}
private class SomeRelatedStuff {
public SomeRelatedStuff()
public static SomeRelatedStuff Load(int id) {
var something = GetSomething();
var somethingElse = GetSomethingElse(something);
var model = new SomeViewModel(somethingElse);
MakeObject();
return this;
}
private string GetSomething() {
...
return someVal;
}
private SomeObject GetSomethingElse(string something) {
...
return someBigObject;
}
private void MakeObject () {
...
}
}
作为旁注,请阅读Robert Martin(Bob叔叔)的《干净的代码》,本周末至少阅读前4章。然后再读一遍 首先,摆脱你的魔法弦。将排序顺序设置为枚举,如下所示:
public enum ActionSortOrder {
Credits,
Elective,
...
}
ActionSortOrder order = ActionSortOrder.Credits;
这比使用未定义的字符串更易于管理,如果需要对枚举成员的功能进行说明,可以对其进行文档化
其次,该方法顶部的行有些混乱:
ViewBag.CreditsSortParm = sortOrder == "Credits" ? "Credits desc" : "Credits";
那么,如果您将“信用”作为排序顺序传递,它默认为降序?如果没有,它默认为升序?为什么?为什么不为升序/降序提供一个选项(同样是使用枚举而不是神奇字符串)?为什么每次调用此方法时都会保存所有这些排序顺序?这些设置变量在哪里使用?您只使用此方法中传入的顺序
另外,不要担心交换机看起来太大。Switch语句通常仅用于避免一组if-else语句。因此,大多数交换机在实践中都有相当多的情况
了解更多关于代码的信息有助于评估代码。只是好奇为什么不使用ViewModel而不是ViewBag?是的,首先将所有单独的部分移出,然后再次重构,重复。这是我第一个较长的方法之一-我在知道ViewModel之前就编写了它。不,将一个被调用的方法直接移动到调用方下面是合适的,这样两年后维护它的开发人员就不必到处搜索了。代码应该读起来像一本书,一件事,然后在它下面,下一件,然后下一件。。当你的键盘上有一个可爱的F12按钮时,你能找不到一个方法吗?我讨厌你现在告诉我这件事,而不是昨天,因为我有足够的时间在我离开镇上四天的周末之前让亚马逊在一夜之间把它给我。我想我得在某处的大楼里找到它。谢谢你的提示!我正在展示一张表格,上面有人可以报名参加的“学校课程”的所有细节。每个排序参数都是可以排序的特征之一。因此,他们可以按学分最多或最少的课程进行排序,或者按标题的字母顺序进行排序,等等。