【问题标题】:Should I create a class or add a property我应该创建一个类还是添加一个属性
【发布时间】:2014-12-14 22:24:48
【问题描述】:

我目前正在设计一个使用 C#/WPF 和 MVVM 模式跟踪和管理个人财务的软件。这是我自己做的一个个人项目,我开始有兴趣获得更多关于这些技术的知识并将其放入我的投资组合中,因此没有时间/金钱/等限制,我正在努力做到最好设计明智的决策。

在我的软件的模型部分,我目前有像ExpenseIncome 这样的类,它们继承了一个公共接口ITransaction。我还有像BankAccountCreditCardLoan 这样的类,它们继承了一个公共接口IAccount。费用和收入之间没有任何区别,它们具有相同的属性,例如NameDescription 等。BankAccountCreditCardLoan 也是如此:它们都具有相同的属性。由于这些在 MVVM 的模型部分,据我所知,它们不应该有方法,因为它们不应该直接在其中实现任何逻辑(除了可以在属性本身中完成的属性验证)。

我早期遇到的一个问题(实际上我刚刚开始这个项目),是我是否应该改变那个设计,因为虽然它们模拟了现实生活中的一些具体的东西,但它们之间根本没有区别(@987654333 @ 只是 Income 等的复制粘贴)。我是否应该将我的设计更改为在 Transaction 类中具有 TransactionType 属性,以便区分收入和支出,而不是让类类型来实现这一区别?

从长远来看,每种方法的优缺点是什么?

【问题讨论】:

  • 是的,我同意@GrantWinney,保持代码干净,如果以后需要更改,只需复制粘贴即可。
  • @GrantWinney 假设我保持原样,费用和收入类别永远不会改变(所以它们基本上保持彼此的复制粘贴,但我对它们的处理方式不同在视图模型中)。这在项目后期不会被认为是糟糕的设计吗?
  • @Choub890 我能不能给个建议:为你现在需要的东西开发,以一种你以后需要的时候可以扩展它的方式去做,你应该没问题
  • 我也同意@GrantWinney。我认为无论哪种方式你都不会走得太远,但是使用单独的类更安全,给你更大的灵活性。

标签: c# wpf mvvm architecture


【解决方案1】:

如果您在两者之间犹豫不决,您可以从更简单的选项开始 - 具有指示事务类型的属性的单个类。

public class Transaction
{
    public string AccountNumber { get; set; }

    public decimal Amount { get; set; }

    public TransactionType TransType { get; set; }
}

public enum TransactionType
{
    Income,
    Expense
}

如果您稍后决定这两个概念存在分歧,并且您需要为其中一个或另一个提供单独的功能,您始终可以创建扩展 Transaction 的单独类,这有望避免一些重构难题:

public class Credit : Transaction
{
    public Credit()
    {
        TransType = TransactionType.Income;
    }

    public void SomeOtherMethodYouRealizedYouNeed()
    {
        // Do something
    }
}

public class Expense : Transaction
{
    public Expense()
    {
        TransType = TransactionType.Expense;
    }

    public int SomeNewProperty { get; set; }
}

就我的两分钱...

【讨论】:

  • 我从一开始就更喜欢继承模型。它几乎总是必须在以后重构。我什至不会考虑现在拥有SomeType 属性。同时拥有继承和Type 属性无论如何都是多余的,那么为什么还要麻烦呢?它只会让事情变得更复杂。
【解决方案2】:

最后,我将保持我的设计原样,即 ExpenseIncome 类继承 ITransaction 接口(@98​​7654324@、Loan 和 @987654326 也是如此@ 使用 IAccount 接口),因为正如 cmets 所指出的,即使有一天我需要与这些类不同的行为,它也是最容易重构的。这可以像不同的属性验证逻辑一样简单(即使ExpenseIncome 仅具有属性而没有方法也可能是这种情况)。

此外,类是应该从您的软件使用的对象或现实生活概念建模的东西。我认为,出于这个原因,ExpenseIncomeBankAccountLoanCreditCard 应该是类,即使目前它们之间的逻辑没有区别,因为它们是概念或“我的软件必须建模的对象”。

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多