Представьте приложение, в котором у вас есть класс с именем «Транзакция», представляющая собой финансовую операцию.Открытый вопрос с открытым кодом
Эти операции могут быть классифицированы на основе значений свойств класса Transaction и некоторых бизнес-правил.
Перечислимое имя TransactionType представляет возможное значение такой классификации: Type1Transaction, Type2Transaction, NotRelevant.
Тип1Transactions и Type2Transactions будут сообщены, поскольку они несколько подозрительны, NotRelevant транзакций не сообщается.
Этот вид классификации интересен только для того, чтобы сообщать о транзакции и не представляет собой внутреннее свойство класса Transaction (поэтому класс Transaction не имеет свойства, представляющего эту классификацию).
Ну, на данный момент мы хотим написать класс, ответственность которого определяется классификацией данной транзакции, назовем ее TransactionClassificator.
Его интерфейс выставляет метод GetTransactionType(), возвращаемым значением которого является TransactionType. Наиболее очевидная реализация выглядит следующим образом:
public TransactionType GetTransactionType()
{
if(IsType1Transaction())
return TransactionType.Type1Transaction;
if(IsType2Transaction())
return TransactionType.Type2Transaction;
return TransactionType.NotRelevant;
}
Этот метод явно нарушает OCP принципа: он не закрыт для изменений, потому что она должна быть изменена каждый раз, когда будет введена новая величина для перечисления TransactionType. Я не могу понять, как использовать абстракцию для исправления нарушения принципа OCP в этом конкретном сценарии.
Спасибо за помощь.
Энрико
Я не вижу проблемы.Здесь выполняется абстракция, конечно, ее нужно модифицировать, если изменяется характер абстракции. – Barmar