我已经在C#中开发了大约12个月了(从头开始,除了一点点PHP脚本黑客之外没有以前的开发经验)我喜欢认为我已经将我的技能发展到可以编写应用程序的级别完美地执行其功能.
但是,我仍然对最佳编码实践感到困惑,我理解这段代码很糟糕:
class Example1
{
public static Alert GenerateAlert()
{
Alert AlertObject = new Alert();
AlertObject.AlertDatetime = DateTime.Now;
AlertObject.AlertHasRecords = false;
return AlertObject;
}
}
Run Code Online (Sandbox Code Playgroud)
例如,如果AlertDatetime需要的不仅仅是一条简单的线条,DateTime.Now;我将最终填满一个庞大的功能.不好!
但是,我不能看到以下两个例子的问题(我赞成例2)
class Example2
{
public static Alert AlertObject = new Alert();
public static Alert GenerateAlert()
{
PopulateAlertDate();
CheckForAlertRecords();
return AlertObject;
}
private static void CheckForAlertRecords()
{
AlertObject.AlertHasRecords = false;
}
private static void PopulateAlertDate()
{
AlertObject.AlertDatetime = DateTime.Now;
}
}
class Example3
{
public static Alert GenerateAlert()
{
Alert AlertObject = new Alert();
AlertObject.AlertDatetime = PopulateAlertDate();
AlertObject.AlertHasRecords = CheckForAlertRecords();
return AlertObject;
}
private static bool CheckForAlertRecords()
{
return false;
}
private static DateTime PopulateAlertDate()
{
return DateTime.Now;
}
}
Run Code Online (Sandbox Code Playgroud)
一个例子比另一个更好,如果是这样,为什么?或者有一种完全不同的方式吗?
你的第一个例子很好.
如果稍后AlertDateTime需要更复杂的函数进行初始化,您可以始终将代码重构为类似示例3.在此之前,请尊重KISS(保持简单)和YAGNI原则.
请注意,界面(公开可用的方法及其签名)在示例1和3之间不会发生变化.这是一件好事.这意味着您可以在这些样式之间移动,而无需修改使用您的类的代码.
但是,示例2存在很多问题:
该信息隐藏的原则基本上是说,你不应该没有充分的理由公开揭露的东西.为什么要将新生成的警报存储在可公开访问的"全局变量"中?
示例2 表现不同:如果您调用GenerateAlert两次,它将同时返回对同一 Alert对象的引用.(想想如果你明天再打一次会发生什么.)
作为旁注,可以改进示例3中方法的命名.试想想,在隔离每个方法的:PopulateAlertDate()不不填充警报的日期.它返回一个可用于填充警报日期的日期.这个名字GetDefaultAlertDate()可能更合适.