Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该把我的第一种方法放在哪里_C#_Oop_Methods - Fatal编程技术网

C# 我应该把我的第一种方法放在哪里

C# 我应该把我的第一种方法放在哪里,c#,oop,methods,C#,Oop,Methods,我需要添加一个方法来计算工人工资和他的上级工资的加权和。我想要这样的东西: class CompanyFinanse { public decimal WeightedSumOfWorkerSalaryAndSuperior(Worker WorkerA, Worker Superior) { return WorkerA.Salary + Superior.Salary * 2; } } 这是一个好的设计还是我应该把这个方法放在其他地

我需要添加一个方法来计算工人工资和他的上级工资的加权和。我想要这样的东西:

class CompanyFinanse
{
      public decimal WeightedSumOfWorkerSalaryAndSuperior(Worker WorkerA, Worker Superior)
      {
           return WorkerA.Salary + Superior.Salary * 2;
      }
}

这是一个好的设计还是我应该把这个方法放在其他地方?我刚刚开始设计这个项目,并考虑一种很好的、面向对象的方法来组织类中的方法。所以我想从我脑海中的OOP开始。需要最佳实践

要使您的设计成为面向对象的,您应该从考虑整个应用程序的用途开始。如果应用程序中只有一种方法(加权和),那么就没有太多的设计需要继续

如果这是一个财务应用程序,也许您可以有一个包含工人工资和一些实用函数的Salary类

对于您指出的方法,如果Worker类有对其上级的引用,则可以将此方法作为Worker类的一部分


如果没有关于应用程序用途的更多信息,就很难提供良好的指导。

我会将其放在worker类中,或者在finance库中使用静态函数。我不认为金融对象真的有意义,我认为它更多的是一套业务规则,而不是任何东西,所以它是静态的

public class Worker {
     public Worker Superior {get;set;}
     public readonly decimal WeightedSalary {
         get {
              return (Superior.Salary * 2) + (this.Salary)
         }
     }
     public decimal Salary {get;set;}
}


因此,在不了解更多您的领域的情况下,可能不可能给您一个关于“最佳实践”的完整答案,但我可以告诉您,您可能会在这么早就考虑实施细节,从而将自己置于灾难之中

如果你像我一样,那么你被教导好的OOD/OOP是非常详细的,并且涉及到。直到我职业生涯的后期,我才发现这正是许多项目在以后的道路上变得异常无法维护的原因。对项目可能如何工作进行了假设,而不是允许设计从实际使用的代码中自然产生

简单地说:你需要做/(行为/测试驱动的开发)

  • 从一个粗略的领域模型开始,但要避免太多细节
  • 选择一个你想要开始的功能领域。最好在模型的顶部,或者用户将与之交互的位置
  • 集思广益,讨论该单元应具备的预期功能,并列出清单
  • 在该单元上开始TDD循环,然后在执行过程中积极重构
  • 你最终得到的正是你真正需要的,而不是你不需要的(大多数时候)。您还获得了全面测试覆盖率的额外好处,这样您就可以在以后重构,而不用担心破坏内容:)

    我知道我没有给你任何代码,但那是因为我给你的任何东西都可能是错误的,然后你就会被它卡住。只有您知道代码实际将如何使用,您应该以这种方式开始编写代码。TDD主要关注代码的外观,然后您可以在执行时填写实现细节

    关于这一点的完整解释超出了本文的范围,但是有大量的在线资源以及大量的书籍是开始TDD实践的优秀资源。这两个人应该给你一个好的开始


    继brien的回答之后,我建议看看(班级责任协作)的实践。有许多信息来源,包括:

    • 来自加州保利大学
    • 在敏捷建模网站上,以及
    • ,其中讨论了该实践及其在多种语言中的使用

    理解哪个类应该“拥有”一个特定的行为(和/或哪个类应该在实现一个给定的用例时进行协作),通常是一种自上而下的讨论,由系统为用户所做的总体设计来驱动。

    很容易发现您的代码是否需要改进。代码片段中有一种代码味道。你应该解决这个问题

    很好,您对该方法有一个非常声明性的名称。但是它太长了。听起来,如果您将该方法保留在这个
    Finanse
    类中,那么不可避免地必须在方法名称中使用所有这些单词来理解该方法的意图

    它基本上意味着这个方法可能不属于这个类

    解决这种代码气味的一种方法是,如果我们在另一个类上有方法,那么您是否可以得到一个较短的方法名。我看到你们有
    工人
    工资
    课程

    假设这些是剩下的唯一类,并且您不想增加更多类,我会将此设置为
    Salary
    <代码>薪资知道如何在另一个薪资(本例中为上级薪资)作为输入的情况下计算加权薪资。现在,方法名称不需要超过两个单词


    @Shawn的答案是解决这种代码气味的一种变体。(我想您可以称之为“长方法名”代码气味)

    谢谢您的回答。我只是在想这个。所以困扰我的是如何决定设计。这个方法肯定会在这个系统中的几个地方使用,因为它将作为一个公司财务系统工作。只需在您拥有的任何一个类中编写函数,然后将其移动,如果很明显它更适合其他地方。我会选择你的答案中的第一个选项。有人编辑了此选项以在方法声明中添加静态,但我不确定是否需要它,因为它在类中声明。。。人力资源管理
    public static class Finance {
         public static decimal WeightedSumOfWorkerSalaryAndSuperior(Worker WorkerA, Worker Superior) {
             return WorkerA.Salary + Superior.Salary * 2; }
    }