Я пишу классы, которые «должны использоваться особым образом» (я думаю, все классы должны ...).
Например, я создаю fooManager
класс, который требует вызова, скажем, Initialize(string,string)
. И, чтобы продвинуть пример немного дальше, класс был бы бесполезен, если бы мы не слушали его ThisHappened
действие.
Я хочу сказать, что класс, который я пишу, требует вызовов методов. Но он будет хорошо скомпилирован, если вы не вызовете эти методы, и в результате вы получите пустой новый FooManager. В какой-то момент он либо не будет работать, либо может зависнуть, в зависимости от класса и того, что он делает. Программист, который реализует мой класс, очевидно, заглянет в него и поймет: «О, я не вызывал Initialize!», И это было бы хорошо.
Но мне это не нравится. В идеале я хотел бы, чтобы код НЕ компилировался, если метод не вызывался; Я предполагаю, что это просто невозможно. Или что-то, что было бы сразу видно и ясно.
Меня беспокоит текущий подход, который я здесь использую, а именно:
Добавьте приватное логическое значение в класс и везде проверяйте, инициализирован ли класс; если нет, я сгенерирую исключение, говорящее «класс не был инициализирован, вы уверены, что звоните .Initialize(string,string)
?».
Я в порядке с таким подходом, но он приводит к большому количеству кода, который компилируется и, в конце концов, не нужен конечному пользователю.
Кроме того, иногда даже больше кода, когда есть больше методов, чем просто Initiliaze
вызов. Я стараюсь держать в своих занятиях не слишком много открытых методов / действий, но это не решает проблему, а просто делает ее разумной.
То, что я ищу здесь:
- Мой подход правильный?
- Есть ли лучший?
- Что вы, ребята, делаете / советуете?
- Я пытаюсь решить не проблему? Мне сказали коллеги, что программист должен проверить класс, прежде чем пытаться его использовать. Я с уважением не согласен, но это другое дело, я верю.
Проще говоря, я пытаюсь найти способ никогда не забывать реализовывать вызовы, когда этот класс используется повторно позже или кем-то еще.
РАЗЪЯСНЕНИЯ:
Чтобы уточнить многие вопросы здесь:
Я определенно говорю не только об части инициализации класса, а скорее о целой жизни. Не позволяйте коллегам дважды вызывать метод, следя за тем, чтобы они вызывали X перед Y и т. Д. Все, что в конечном итоге было бы обязательным и в документации, но мне бы хотелось, чтобы в коде он был как можно более простым и небольшим. Мне очень понравилась идея Asserts, хотя я совершенно уверен, что мне нужно смешать некоторые другие идеи, поскольку Asserts не всегда будут возможны.
Я использую язык C #! Как я не упомянул это ?! Я работаю в среде Xamarin и создаю мобильные приложения, в которых обычно используется от 6 до 9 проектов, включая проекты PCL, iOS, Android и Windows. Я был разработчиком около полутора лет (школа и работа вместе), поэтому мои иногда смешные заявления \ вопросы. Все это, вероятно, здесь неактуально, но слишком много информации не всегда плохо.
Я не всегда могу поместить все, что является обязательным, в конструктор из-за ограничений платформы и использования Dependency Injection, когда параметры, отличные от Interfaces, не обсуждаются. Или, может быть, моих знаний недостаточно, что весьма возможно. Большую часть времени это не проблема инициализации, но больше
как я могу убедиться, что он зарегистрирован на это событие?
как я могу убедиться, что он не забыл «остановить процесс в какой-то момент»
Здесь я помню класс извлечения рекламы. До тех пор, пока видимость объявления видима, класс будет получать новое объявление каждую минуту. Этот класс нуждается в представлении, когда он создан, где он может отображать объявление, которое может явно входить в параметр. Но как только представление исчезнет, необходимо вызвать StopFetching (). В противном случае класс продолжит получать рекламу для просмотра, которого даже нет, и это плохо.
Кроме того, в этом классе есть события, которые необходимо прослушивать, например, AdClicked. Все работает нормально, если не слушать, но мы теряем отслеживание аналитики там, если отводы не зарегистрированы. Реклама по-прежнему работает, поэтому пользователь и разработчик не увидят разницы, а аналитика просто будет иметь неверные данные. Этого следует избегать, но я не уверен, как разработчик может знать, что он должен зарегистрироваться на событие Дао. Хотя это упрощенный пример, но идея есть: «убедитесь, что он использует публичное действие, которое доступно» и в нужное время, конечно!
initialize
быть сделан поздно после создания объекта? Будет ли ctor слишком «рискованным» в том смысле, что он может генерировать исключения и разрывать цепочку создания?
new
если объект не готов к использованию. Полагаться на метод инициализации непременно придется преследовать вас, и его следует избегать, если в этом нет крайней необходимости, по крайней мере, таков мой опыт.