【问题标题】:C# static classes. How to improve the code?C# 静态类。如何改进代码?
【发布时间】:2017-10-02 09:03:55
【问题描述】:

作为一名前 Matlab 用户,我发现使用类很难,因为在 Matlab 中我不习惯使用类。

现在,我有 C# Winforms 项目,它工作正常,但我觉得它有代码味道并且设计模式错误。大多数时候,我正在做的是创建静态类并在该类中实现所有相关方法。归根结底,我的项目充满了这些静态类。

如果您查看这些代码并就可以采取哪些措施来改进代码提出一些建议,那就太好了。

  • 假设我有主窗口,它有 3 个按钮(添加、更新、 删除数据库中的记录)
  • 然后,我有一个包含所有相关方法的静态类。

所以我的问题是完成同样事情的更好方法是什么?

Main.cs

private void AddNewRecord_Click(object sender, EventArgs e)
{
    DatabaseOperations.AddRecord();
}

private void UpdateRecord_Click(object sender, EventArgs e)
{
    DatabaseOperations.UpdateRecord();
}

private void DeleteRecord_Click(object sender, EventArgs e)
{
    DatabaseOperations.DeleteRecord();
}

DatabaseOperations.cs 这是包含所有相关方法的静态类。

namespace MyApp
{
    public static class DatabaseOperations
    { 
        internal static void AddRecord()
        {
            // Implements a method that adding a new record in database
        }

        internal static void UpdateRecord()
        {
            // Implements a method that updating an existing record in database
        }

        internal static void DeleteRecord()
        {
            // Implements a method that deleting an existing record in database
        }
    }
}

【问题讨论】:

  • 关于代码异味等问题(寻求评论)请访问CodeReview
  • 这是您与许多来自纯函数式语言背景的人分享的问题。我觉得这在 SO 上是无法回答的。您应该阅读一般的 OOP 和 C# 中的 OOP。不要试图做你在 Matlab 中所做的事情。 “清空杯子”,用 C#/OOP 的方式做事。
  • 正如@EpicKip 所写,这是一个CodeReview 问题或ProgrammersSO 问题。我倾向于说是后者(因为您显示的代码只是您通常所做的示例,而不是您需要帮助的特定案例)。
  • 如果这种方法对你有用 - 很好。我能看到的唯一问题是您是否编写或稍后决定为您的代码编写单元测试。使用静态方法,您将无法“模拟”与特定单元无关的代码。

标签: c# winforms class methods


【解决方案1】:

答案是做面向对象的方式。 这是可以快速完成的事情

  • 将 DatabaseOperations 类和方法更改为公共 非静态的。
  • 在 Main.cs 添加一个构造函数以使 DatabaseOperation 为 输入
  • 在 Program.cs 中使用新的构造函数初始化 Main.cs。
  • ...

到这个时候,我认为要点不会起作用,所以这里是一个代码示例: https://github.com/duongthaiha/WinformOODIExample

希望对你有帮助

【讨论】:

  • 谢谢你的例子,很清楚。将代码从那个(我发布的那个)更改为这个有什么好处?
  • 这些建议为您指明了使用 OOP 的方法。一个优点是,使用成员方法与静态方法相比,您将来可以使用不同的类(继承自当前的 DatabaseOperations 类),它可以以不同的方式实现相同的方法:您不需要重写调用这些方法的客户端代码,但只重写创建实例时调用方法的行。我同意您原始帖子中的@Fildor 评论:您应该以 C#/OOP 方式进行。没有什么可以在评论的空间中解释(也不是一个回答)。
猜你喜欢
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2020-05-28
相关资源
最近更新 更多