我目前正在设计一个软件,使用C#/ WPF和MVVM模式来跟踪和管理个人的财务。这是我自己做的个人项目,我开始对利用这些技术获得更多知识并投入我的投资组合感兴趣,因此没有时间/金钱/等限制,我正在努力做到最好决策设计明智。
在我的软件的模型部分中,我目前拥有继承公共接口Expense
的类Income
和ITransaction
。我还有类似BankAccount
,CreditCard
和Loan
的类,它们继承了公共接口IAccount
。费用和收入在它们之间没有任何差异,它们具有相同的属性,如Name
,Description
等。BankAccount
,CreditCard
和{{1它们都具有相同的属性。由于它们属于MVVM的模型部分,据我所知,它们不应该有方法,因为它们不应该直接在它们中实现任何逻辑(除了可以在属性本身中完成的属性验证)。
我早期遇到的一个问题(我实际上刚刚开始这个项目)是,我是否应该改变这种设计,因为当他们模拟现实生活的具体内容时,他们之间没有任何区别({{ 1}}只是Loan
等的复制粘贴。我是否应该更改我的设计,例如,Expense
类中的Income
属性,以便区分收入和费用,而不是让类类型做差异?
从长远来看,每种方法的优点和缺点是什么?
答案 0 :(得分: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; }
}
只是我的两分钱......
答案 1 :(得分:0)
最后,我将保持我的设计方式,即Expense
和Income
类继承ITransaction
接口(同样适用于BankAccount
},Loan
和CreditCard
与IAccount
接口)因为,正如评论所指出的那样,即使有一天我需要来自这些类的不同行为,它也是最容易重构的。这可能就像不同的属性验证逻辑一样简单(即使它们Expense
和Income
只有属性而没有方法,也可能就是这种情况)。
此外,类是应该根据您的软件使用的对象或现实生活概念建模的。我认为,出于这个原因,Expense
,Income
和BankAccount
,Loan
和CreditCard
应该是课程,即使目前没有任何区别他们之间的逻辑,因为那些是概念或"对象"我的软件必须建模。