Я пишу заняття, які "повинні використовуватися певним чином" (я думаю, всі класи повинні ...).
Наприклад, я створюю fooManager
клас, який вимагає дзвінка, скажімо, до Initialize(string,string)
. І, щоб просунути приклад трохи далі, клас був би марним, якщо ми не послухаємо його ThisHappened
дії.
Моя думка, клас, який я пишу, вимагає викликів методів. Але вона складеться чудово, якщо ви не зателефонуєте до цих методів і в кінцевому підсумку вийде з порожнім новим FooManager. У якийсь момент він або не спрацює, або може вийти з ладу, залежно від класу та того, що він робить. Програміст, який реалізує мій клас, очевидно, загляне всередину нього і зрозуміє "О, я не закликав ініціалізувати!", І це було б добре.
Але мені це не подобається. Ідеально хотілося б, щоб код НЕ компілювався, якби метод не викликався; Я здогадуюсь, це просто неможливо. Або щось, що було б відразу видно і зрозуміло.
Мене хвилює існуючий тут підхід, який полягає в наступному:
Додайте приватне булеве значення у класі та перевіряйте всюди, чи потрібно клас ініціалізований; якщо ні, я накину виняток із записом "Клас не був ініціалізований, ви впевнені, що ви телефонуєте .Initialize(string,string)
?".
З таким підходом я все гаразд, але це призводить до того, що багато коду складається і, врешті-решт, не потрібно кінцевому користувачеві.
Крім того, іноді навіть більше коду, коли є більше методів, ніж просто Initiliaze
дзвінок. Я намагаюся підтримувати свої заняття не надто великою кількістю публічних методів / дій, але це не вирішує проблему, просто підтримую її розумною.
Що я тут шукаю:
- Чи правильний мій підхід?
- Чи є кращий?
- Що ви робите / радите?
- Я намагаюся вирішити питання, яке не стосується? Мені сказали колеги, що програміст повинен перевірити клас, перш ніж намагатися ним користуватися. Я з повагою не згоден, але я вважаю, що це інша справа.
Простіше кажучи, я намагаюся знайти спосіб ніколи не забути реалізовувати дзвінки, коли цей клас буде повторно використаний пізніше або хтось інший.
ПОЯСНЕННЯ:
Щоб уточнити багато питань тут:
Я точно не кажу лише про ініціалізацію частини класу, а навпаки, це все життя. Не дозволяйте колегам викликати метод двічі, переконуючись, що вони дзвонять до X перед Y, і т. Д. Все, що в кінцевому підсумку було б обов'язковим і в документації, але що мені хотілося б у коді і якомога простішим і малим. Мені дуже сподобалась ідея Ассерта, хоча я впевнений, що мені потрібно буде змішати деякі інші ідеї, оскільки Ассерти не завжди будуть можливими.
Я використовую мову C #! Як я цього не згадав ?! Я перебуваю в середовищі Xamarin і будую мобільні додатки, зазвичай використовую близько 6 - 9 проектів у рішенні, включаючи проекти PCL, iOS, Android та Windows. Я був розробником близько півтора року (школа і робота разом), звідси мої іноді смішні заяви \ питання. Тут все, мабуть, не має значення, але занадто багато інформації - це не завжди погано.
Я не завжди можу помістити в конструктор все, що є обов'язковим, через обмеження платформи та використання Dependency Injection, маючи параметри, відмінні від інтерфейсів, поза таблицею. А може, мої знання недостатньо, що цілком можливо. Здебільшого це не питання ініціалізації, а більше
як я можу переконатися, що він зареєструвався на цю подію?
як я можу переконатися, що він не забув "зупинити процес в якийсь момент"
Тут я пам’ятаю клас пошуку оголошень. До тих пір, поки видно вигляд, де відображається Оголошення, клас щохвилини отримуватиме нове оголошення. Цей клас потребує перегляду, коли він побудований там, де він може відображати Об'яву, і це очевидно може входити в параметр. Але як тільки перегляд не зникне, потрібно викликати StopFetching (). Інакше клас зберігатиме рекламу для такого перегляду, якого навіть немає, і це погано.
Крім того, у цьому класі є події, які потрібно слухати, наприклад, "AdClicked". Все працює добре, якщо його не слухають, але ми втрачаємо відстеження аналітики там, якщо крани не зареєстровані. Оголошення все ще працює, тому користувач і розробник не побачать різниці, а аналітика просто матиме неправильні дані. Цього потрібно уникати, але я не впевнений, як розробник може знати, що вони повинні зареєструватися на подію дао. Це спрощений приклад, але ідея є, "переконайтеся, що він використовує загальнодоступні дії, доступні", і в потрібний час, звичайно!
initialize
здійснюватися пізно після створення об’єкта? Чи буде ctor занадто "ризикованим", в тому сенсі, що він може кидати винятки і розривати ланцюжок створення?
new
якщо об'єкт не готовий до використання. Покладатися на метод ініціалізації неодмінно поверне переслідувати вас, і його слід уникати, якщо це абсолютно не потрібно, принаймні, це мій досвід.