1. Статична проти екземпляра
Я думаю, що є дуже чіткі рекомендації щодо того, що таке хороший дизайн OO, а що ні. Проблема полягає в тому, що блогосфера ускладнює відокремлення добра від поганого і потворного. Ви можете знайти якісь довідки, що підтверджують навіть найгіршу практику, про яку ви можете придумати.
І найгірша практика, яку я можу придумати, - це Глобальний штат, в тому числі статики, про які ви згадали, і всіма улюблений синглтон. Деякі уривки з класичної статті Місько Гевери на цю тему .
Щоб реально зрозуміти залежності, розробники повинні прочитати кожен рядок коду. Це спричиняє Spooky Дію на відстані: під час запуску тестових наборів, глобальний стан, мутований в одному тесті, може призвести до несподіваного подальшого або паралельного тестування. Розбийте статичну залежність, використовуючи ручне введення або залежність від Гейса.
Моторошна дія на відстані - це коли ми запускаємо одну річ, про яку ми вважаємо ізольованою (оскільки ми не передавали жодних посилань), але несподівані взаємодії та зміни стану відбуваються у віддалених місцях системи, про які ми не говорили об'єкту. Це може статися лише через глобальну державу.
Ви, можливо, раніше не думали про це так, але щоразу, коли ви використовуєте статичний стан, ви створюєте таємні канали зв’язку і не чітко пояснюєте їх в API. Spooky Action at a Distance змушує розробників читати кожен рядок коду, щоб зрозуміти потенційну взаємодію, знижує продуктивність розробника та плутає нових членів команди.
Це зводиться до того, що ви не повинні надавати статичні посилання на що-небудь, що має певний збережений стан. Єдине місце, в якому я використовую статику, - це перераховані константи, і я маю сумніви щодо навіть цього.
2. Методи із вхідними параметрами та поверненими значеннями порівняно з методами без жодних
Вам потрібно усвідомити, що методи, які не мають вхідних параметрів і не мають вихідних параметрів, гарантовано працюють у якомусь внутрішньо збереженому стані (інакше, що вони роблять?). Є цілі мови , побудовані на ідеї уникати збереженого стану.
Будь-який час, коли ви зберігаєте стан, у вас є можливість побічних ефектів, тому переконайтесь, що ви завжди використовуєте його з розумом. Це означає, що вам слід віддати перевагу функціям із визначеними входами та / або виходами.
А насправді функції, які визначають входи та виходи, набагато простіше перевірити - вам не потрібно запускати функцію тут і переглядати там, щоб побачити, що сталося, і вам не потрібно десь встановлювати властивість ще перед запуском тестованої функції.
Ви також можете безпечно використовувати цей тип функції як статику. Однак я би цього не зробив, тому що, якби потім пізніше я десь хотів використовувати дещо іншу реалізацію цієї функції, а не надавати іншому екземпляру нову реалізацію, я не можу замінити функціонал.
3. Перекриття проти чіткості
Я не розумію питання. Яка перевага була б у двох методах перекриття?
4. Приватний проти громадського
Не піддавайте нічого, що вам не потрібно виставляти. Однак і я не є великим прихильником приватного. Я не розробник C #, а розробник ActionScript. Я провів багато часу в коді Adobe Flex Framework, який був написаний приблизно в 2007 році. І вони зробили кілька по-справжньому поганих варіантів того, що робити приватним, що робить його таким, як кошмар, намагаючись розширити свої класи.
Тож якщо ви не вважаєте, що ви кращий архітектор, ніж розробники Adobe приблизно у 2007 році (з вашого питання, я б сказав, що у вас є ще кілька років, перш ніж у вас є можливість висловити це твердження), ви, ймовірно, хочете просто замовчувати захищений .
У ваших прикладах коду є деякі проблеми, які означають, що вони не добре сконструйовані, тому вибрати A або B. неможливо.
З одного боку, ви, ймовірно, повинні відокремити створення об'єкта від його використання . Таким чином, ви зазвичай не мали б свого new XMLReader()права поруч із тим, де воно використовується.
Крім того, як говорить @djna, ви повинні інкапсулювати методи, які використовуються у вашому XML Reader, щоб ваш API (приклад прикладу) міг бути спрощений до:
_document Document = reader.read(info);
Я не знаю, як працює C #, але, оскільки я працював з низкою веб-технологій, я б підозрював, що ви не завжди зможете повернути XML-документ негайно (за винятком, можливо, як обіцянки чи майбутнього типу об'єкта), але я не можу дати вам поради щодо обробки асинхронного навантаження в C #.
Зауважте, що при такому підході ви можете створити кілька реалізацій, які можуть приймати параметр, який вказує їм, де / що слід читати та повертати XML-об’єкт, і поміняти їх на основі потреб вашого проекту. Наприклад, ви можете читати безпосередньо з бази даних, з локального магазину або, як у вашому оригінальному прикладі, з URL-адреси. Ви не можете цього зробити, якщо використовуєте статичний метод.