2016-05-23 6 views
0

Я расскажу немного абстрактно, чтобы сделать постановку задачи кратким и кратким. Для всех целей предположим, что .NET/C# является основной технологией/языком.Один тип против нескольких типов

Предположим, вы пишете программную программу и проектируете некоторый класс/тип, чтобы представлять интересующую вас компанию. Вы узнаете, что у этого объекта есть какой-то жизненный цикл с разными состояниями. Поскольку экземпляры этой сущности переходят из одного состояния в другое, они получают определенные атрибуты/свойства, но теряют других.

Теперь, если вы разрабатываете класс/тип для представления такого объекта, одним из вариантов выбора является введение одного всеобъемлющего типа класса, который включает в себя надмножество всех возможных свойств объекта на протяжении всего его жизненного цикла.

Другим вариантом является введение какой-либо иерархии типов, в которой вы представляете интересующую вас компанию, используя различные типы, каждая из которых представляет ее в определенном состоянии.

Теперь мои вопросы:

  1. Вообще говоря, как можно решить, представляющих различные Штаты/аспекты сущности лучше достигается с использованием свойств/атрибутов одного типа против различных типов?

  2. Если вы решили представить свой объект с использованием нескольких типов:

    а. Как бы вы решали случаи, когда определенные свойства этого объекта присутствуют/определены в нескольких состояниях?

    b. Что делать, если ваша сущность сохраняется или сериализуется, например, с помощью JSON? Как бы вы могли сериализовать его и десериализировать, учитывая все разные типы, представляющие разные состояния?

ответ

0

Вы могли бы хотеть рассмотреть основывая такой объект вокруг .net ExpandoObject (MSDN link) - вы можете динамически добавлять/удалять свойства к нему и запросить, имеет ли он данное свойство Это дает большую гибкость, чем пытаться. создайте целую (статическую) иерархию.

0

Если вам нужно использовать несколько типов, вы можете создавать и удалять экземпляры из одного типа в другой путем их копирования или создания фабрики для создания экземпляров нового типа.

Но я бы не стал полагаться только на иерархию типов, поскольку внутреннее состояние unavoida в конечный автомат.

2

Оба ваших решения не очень хороши. То, что вы действительно хотите, - это алгебраические типы данных, a.k.a. непересекающиеся или дискриминационные союзы. К сожалению, большинство языков OO старой школы не имеют таких. В экосистеме .NET в основном F # имеет надлежащую поддержку для них. См. here или here для краткого введения.