c# - 是否有 "right"方法来抽象出我的代码?

标签 c# oop

<分区>

我已经使用 C# 进行了大约 12 个月的开发(从头开始,除了一点点 PHP 脚本黑客之外没有以前的开发经验),我认为我的技能已经发展到可以编写应用程序,它完美地执行了它的功能。

但是,我仍然对最佳编码实践感到困惑,我知道这段代码很糟糕:

class Example1
{
    public static Alert GenerateAlert()
    {
        Alert AlertObject = new Alert();

        AlertObject.AlertDatetime = DateTime.Now;
        AlertObject.AlertHasRecords = false;

        return AlertObject;
    }
}

例如,如果 AlertDatetime 需要的不仅仅是像 DateTime.Now; 这样的简单行,我最终会增加一个庞大的函数。不好!<​​/p>

但是,我看不到以下两个示例的问题(我喜欢示例 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;
    }

}

一个例子比另一个好吗?如果是,为什么?还是有完全不同的方法?

最佳答案

你的第一个例子很好。

如果稍后 AlertDateTime 需要初始化更复杂的函数,您可以随时重构您的代码,使其成为示例 3 之类的代码。在此之前,请尊重KISS(保持简单)和 YAGNI原则。

请注意,接口(interface)(公开可用的方法及其签名)在示例 1 和示例 3 之间没有变化。这是一件好事。这意味着您可以在这些样式之间移动,而无需修改使用您的类的代码。

然而,示例 2 存在很多问题:

  • information hiding principle基本上说你不应该没有充分的理由公开暴露一些东西。为什么要将新生成的警报存储在可公开访问的“全局变量”中?

  • 示例 2 行为不同:如果您调用 GenerateAlert 两次,它将两次返回对相同 Alert 对象的引用. (想想如果今天调用一次,明天调用一次会怎样。)

附带说明一下,示例 3 中方法的命名可以改进。尝试孤立地考虑每个方法:PopulateAlertDate() 不会填充警报日期。它返回一个可以用于填充警报日期的日期。名称 GetDefaultAlertDate() 可能更合适。

关于c# - 是否有 "right"方法来抽象出我的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31071041/

相关文章:

c# - Entity Framework - 一对多关系的问题

c# - 使用 CSS 类和在线特定规则格式化 ASP.NET ReportViewer?

java - 处理依赖 Java 库添加新类吗?

c# - 将嵌套在 ForEach 循环中的 for 循环转换为 LINQ

c# - MVC4错误-路由表中没有路由匹配

c# - 从 C# 调用 C++ dll 方法

c# - 在使用后立即在 WCF ChannelFactory<T> 和 T channel 对象上调用 dispose 有多重要?

python - 在这种情况下避免困惑循环的最佳方法是什么?

java - 如何纠正? -- "both define getObjectCopy(), but with unrelated return types"-- 但它是*一个*函数

php - select count() 查询中的 limit 子句未按我的预期工作