2014-12-13 2 views
2

В настоящее время я разрабатываю программное обеспечение для отслеживания и управления финансами отдельных лиц с использованием C#/WPF и шаблона MVVM. Это личный проект, который я делаю сам по себе, что я начал интересоваться приобретением большего количества знаний с этими технологиями и поставить в мое портфолио, поэтому без ограничений времени и денег/etc я стараюсь взять лучшее решения конструктивно.Должен ли я создать класс или добавить свойство

В модельной части моего программного обеспечения в настоящее время у меня есть классы, такие как Expense и Income, которые наследуют открытый интерфейс ITransaction. У меня также есть классы, такие как BankAccount, CreditCard и Loan, которые наследуют открытый интерфейс IAccount. Расходы и доходы не имеют никакой разницы между ними, они имеют те же свойства, что и Name, Description и т. Д. То же самое касается BankAccount, CreditCard и Loan: все они имеют одинаковые свойства. Насколько мне известно, они не должны иметь методов, поскольку они не должны иметь никакой логики, реализованной непосредственно в них (кроме проверки свойств, которая может быть выполнена в самих свойствах).

Вопрос, который у меня есть на раннем этапе (я на самом деле только начинаю этот проект), должен ли я изменить этот дизайн, поскольку, пока они моделируют что-то конкретное из реальной жизни, у них нет никакой разницы между ними (Expense это всего лишь копия пасты Income и т. д.). Должен ли я менять свой дизайн, чтобы иметь, например, свойство TransactionType в классе Transaction, чтобы отличать доход от расхода, вместо того, чтобы тип класса имел это различие?

Каковы преимущества и недостатки каждого метода в долгосрочной перспективе?

+2

Оба способа работы (отдельные классы, реализующие интерфейс, против одного класса со свойством типа транзакции). Это не то, и другое; это зависит от вашей ситуации.И поскольку вы только начинаете, вам, вероятно, следует выбрать один и запустить с ним немного. Лично, если есть вообще вероятность того, что Расход и Доход могут расходиться (хотя они теперь идентичны), я мог бы оставить их отдельно от начала и сэкономить позже. –

+0

Да, я согласен с @GrantWinney, сохраняю ваш код чистым, поэтому, если вам нужно будет его изменить, вы просто скопируете его, и все готово. – alexo

+0

@GrantWinney Предположим, что я сохраняю вещи так, как они есть, и класс расходов и доходов никогда не изменяется (поэтому они в основном остаются копией друг друга, но отличаются только тем, что я делаю с ними в ViewModel). Разве это не будет считаться плохим дизайном позже в проекте? – Choub890

ответ

0

В конце концов, я буду держать мой дизайн так, как это есть, который с и Expense и Income класса наследующегоИнтерфейс(то же самое относится к BankAccount, Loan и CreditCard с интерфейсом IAccount), поскольку, как отмечалось в комментариях, это было бы самым легким для рефакторинга, даже если наступил день, когда мне нужно различное поведение от этих классов. Это может быть так же просто, как и другая логика проверки свойств (что может иметь место, хотя они Expense и Income имеют только свойства и методы).

Кроме того, класс - это то, что должно быть смоделировано из объекта или концепции реальной жизни, которую использует ваше программное обеспечение. Я думаю, по этой причине Expense, Income и BankAccount, Loan и CreditCard должны быть классами, даже если на данный момент между ними нет разницы в логике, поскольку это понятия или «объекты», которые мое программное обеспечение должно моделировать.

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

Я предпочитаю модель наследования с самого начала. Это почти всегда нужно реорганизовать на это позже. Я бы даже не подумал, что теперь имеет свойство 'SomeType'. В любом случае наличие как наследства, так и свойства 'Type' является избыточным, поэтому зачем вообще беспокоиться? Это только усложняет ситуацию. – t3chb0t

+0

Это верно, 'TransType' не понадобится после создания отдельных классов. Но я шел по пути наименьшего рефакторинга, и если бы все зависело от присутствия TransType, это означало бы еще больше рефакторинга, чтобы удалить его. Кроме того, класс «Транзакция» все еще существует, и в некоторых случаях кто-то может захотеть использовать его напрямую и указать TransactionType. –

Смежные вопросы