Як насправді з’ясувати, що потрібно зробити в об'єктно-орієнтованому дизайні?


12

По-перше, відмова від відповідальності: я не знаю, чи відповідає це питання цьому веб-сайту, але я все ще вважаю актуальним питання не лише до мене, але і для інших, хто є початківцями. Якщо питання можна вдосконалити, щоб відповідати тут, будь ласка, зверніть увагу на int коментарі. Якщо це не підходить, дайте мені знати і, якщо можливо, повідомте мені, де це можна обговорити, тому що я не знайшов для цього хороших форумів.

Я навчився програмувати в 2009 році, коли вивчав PHP. Пізніше в 2012 році я перейшов на C # і .NET. У всякому разі, кодування - це не проблема, записування алгоритмів - це не моя проблема. Моя актуальна проблема полягає в тому, щоб знати, що потрібно закодувати для досягнення вимоги і де це потрібно закодувати.

Більшість курсів, доступних в Інтернеті, стосуються того, як - як писати код на певній мові, як використовувати деякі набори API та ін. Це не моя суть у цьому.

У ці роки я багато читав про купу речей: об’єктно-орієнтований аналіз та дизайн, шаблони дизайну, дизайн, керований доменом тощо. Я розумію, наприклад, принципи SOLID, деякі основні ідеї DDD, такі як необхідність залучення експертів домену, розвиток всюдисущої мови тощо. Я б наважився сказати, що я теоретичний досвід принаймні розумний.

Але коли справа доходить до мене, я відчуваю, що я катастрофа. Деякий час тому мені потрібно було продовжувати розвиток фінансової системи, яку вже розробляв хтось інший. Це така "стара система", розроблена за допомогою C # та WinForms. Я вперше обрав проект із реальною складністю домену, з великою кількістю правил бізнесу тощо.

Зізнаюсь, що, коли я отримую вимоги більшість часу, я думаю, "як це можна зробити?" - Я не маю уявлення про те, як навіть почати працювати над вимогами, щоб зрозуміти, що потрібно зробити. Мої основні плутанини, на які я вважаю, - це те, що я повинен кодувати, які класи, інтерфейси і куди йде кожна логіка, на якому класі повинна бути кожна річ. Проблема в тому, що я не знаю, з чого почати.

Здебільшого, з досить великою думкою, я закінчуюсь деякими ідеями, але ніколи не знаю, як судити, чи моя ідея правильна чи ні.

Я маю на увазі, що я не думаю, що це відсутність теорії, тому що я сказав, що я читав про купу речей щодо архітектури програмного забезпечення та орієнтації на об'єкти, які мені рекомендували, але це не дуже допомогло визначити, що потрібно зробити на практиці .

Тож як я можу навчитися дійсно робити об’єктно-орієнтований дизайн? Що я хочу дізнатися, це: задані вимоги знають, як почати працювати над ними в процесі, який призводить до з'ясування того, що потрібно зробити і куди належить кожен фрагмент коду. Як я також можу навчитися судити, чи моя ідея правильна чи ні?

Я вважаю, що повне пояснення цього як відповіді тут було б неможливим. Що я шукаю, але це може бути відповідно до стилю сайту - це відповіді, які просто дають огляд та вказують деякі довідники (книги, онлайн-курси тощо), які можна використовувати для розширення ідей та дійсного вивчення цих речей.


1. Ви вже розумієте всі основні поняття C #, включаючи такі речі, як різниця між перевантаженням оператора та переоперацією оператора, що таке абстрактний клас та чим він відрізняється від інтерфейсу, інкапсуляції, поліморфізму тощо? Перш за все, це важливо для повного розуміння ОО в C #. Дивіться c-sharpcorner.com/technologies/oop-ood .
Роберт Харві

2
2. Старіші програми, написані на Winforms, як правило, перетворюються на великі кулі з грязюкою, якщо вони не будуються належним чином. Розділення проблем викликає першочергове значення. Дивіться winformsmvp.codeplex.com
Роберт Харві

1
Насправді процес не існує. Дизайн - це здебільшого вміння організувати, що має досвід. Принципи SOLID - це гарний початок, але їх недостатньо, і люди, як правило, губляться в SOLID і забувають, чому принципи існують.
Роберт Харві

1
Почніть мало. Вимоги - це проблеми. Одна проблема може бути такою ж величезною, як "Ми хочемо розробити наступний сайт Stackexchange" або ж так само "ми хочемо, щоб наш наступний Stackexchange мав логін". Перетворіть велику проблему на багатьох, окрім диваків. Загалом, дайте собі шанс зробити справи «неправильно» спочатку та покращитись із часом.
Лаїв

1
Я одночасно хочу підтвердити цю заяву і vtc ...
svidgen

Відповіді:


21

Тож як я можу навчитися дійсно робити об’єктно-орієнтований дизайн? Те, що я хочу дізнатися, це: задані вимоги знають, як почати працювати над ними в процесі, який веде до з'ясування того, що потрібно робити і куди належить кожен фрагмент коду. Як я також можу навчитися судити, чи моя ідея правильна чи ні?

Перш за все, перестаньте вважати об'єктно-орієнтований дизайн правильним. Це як думати англійську як правильну.

Об'єктно-орієнтована парадигма неправильна. Він має певні переваги та недоліки. Це ідеал. Це не єдина наша. Це краще, ніж нічого, але це, звичайно, не все.

Я кодую вже десятиліття. Я вивчав цей матеріал майже до тих пір, поки існували ідеї. Я все ще дізнаюся, що це означає. Експерти ще вивчають, що це означає. Всьому нашому полю менше 100 років.

Тож, коли ви приймаєте купу вимог і виявляєте код, який їх задовольняє, але відчувайте, що написаний вами код - це трагічний безлад, ви не один. Робочий код - це просто перший крок до чудового коду. Код, який працює не тільки, але й інші можуть легко читати та розуміти. Код, який можна швидко адаптувати при зміні вимог. Код, який змушує вас спробувати посидіти і сказати "Ого, це так просто".

Проблема полягає в тому, що ми не отримуємо плату за все це. Ми все це робимо, тому що ми професіонали. Ми повинні робити все це, коли начальник не дивиться, тому що завжди є термін. Але ми хочемо повернутися через 5 років і сказати новачкам: "О так, я це написав. Все ще працює так? Круто".

Як ти потрапив туди? Практика. Не приймайте жодної ідеї дизайну на віру. Хтось не замовкне про те, як дизайн, керований подіями, спростить цей дизайн? Не впевнені, чи праві вони? Побудуйте свій власний проект іграшок вдома, який використовує шаблон спостерігача. Возитися з цим. Спробуйте знайти речі, з якими НЕ допомагає.

Прочитайте. Питання. Тест. Повторіть.

Коли ви доберетеся до того, що ви робите це протягом 80% свого життя, ви будете так само розгублені, як і я.

Зізнаюсь, що, коли я отримую вимоги більшість часу, я думаю, "як це можна зробити?" - Я не маю уявлення про те, як навіть почати працювати над вимогами, щоб зрозуміти, що потрібно зробити. Мої основні плутанини, на які я вважаю, - це те, що я повинен кодувати, які класи, інтерфейси і куди йде кожна логіка, на якому класі повинна бути кожна річ. Проблема в тому, що я не знаю, з чого почати.

Я почував себе так само. Тоді я виявив радість рефакторингу. Будьте готові адаптувати конструкції під час кодування. Спроба розробити все на папері достроково - це важкий спосіб зробити це. Напишіть код, який можна довести неправильно, доведіть його неправильно та виправте.


2
Це чудова відповідь. Я програмую вже 15 років, і додам, що вся сфера програмної інженерії (моя професія) "нечітка" - це поєднання мистецтва та функцій, і залежно від розробника - це більше, ніж інше. Я можу придумати ідею архітектури на папері, але я ніколи не можу розробити деталі дизайну ОО, поки я не потрапляю в бруд, заплутаюся і не знайду, що працює, а що ні.
jropella

Дякую за відповідь! Отже, Ваша думка полягає в тому, що: як тільки у нас є принаймні одне рішення для реалізації вимоги, і воно працює, ми реалізуємо його, а потім, як ми бачимо, як він стосується іншого коду та інших вимог, ми рефакторируем його, щоб зробити його кращим? Але все ж є ситуації, коли я отримую певні вимоги, і я не маю уявлення про те, як почати. Чи є у вас випадки поради щодо того, як це почати? Іноді я вважаю, що найкращим було б обговорити вимоги та можливі втілення, але я працюю один. Чи є якийсь форум, де такий вид дискусії вітається?
користувач1620696

2
Ну по-перше, перестань працювати один. Навіть маючи неосвіченого новачка, який сповільнює вас, щоб пояснити речі, це краще, ніж це. По-друге, навчіться розбивати вимогу на частини. Продовжуйте робити це, поки у вас не з’явиться щось кероване, на якому ви зможете отримати тягу. Напишіть доказ коду концепції у зовсім іншому середовищі, якщо вам доведеться. Просто зробіть щось, що виражає ваше розуміння того, що потрібно. Потім перевірити це вираз. Ви вважаєте, що ви зробили погані припущення. Це добре. Будьте готові їх змінити.
candied_orange

1

Розробка програмного забезпечення зводиться до доставки робочого програмного забезпечення вчасно, на бюджет, дотримуючись усіх ваших критеріїв прийняття. Якщо припустити, що вам вдалося це зробити, сприйнята якість коду чи його структури є вторинною проблемою.

Проблема, звичайно, полягає в тому, що писати новий новий код нового поля, як правило, набагато дешевше і простіше, ніж підтримувати застарілий код, тому замість того, щоб занадто зациклюватися на якості коду чи архітектурі, пам’ятайте, що вашою реальною проблемою є ремонтопридатність.

Зазвичай код вважається досяжним, коли витрати, час та ризики, пов’язані зі зміною цього коду, пропорційно досить низькі, що виправлення помилок або внесення змін до вимог все-таки є економічно вигідним, і, впроваджуючи ці зміни, ви не продовжуєте "спіраль смерті" "ентропії коду.

І навпаки, код вважається нездійсненним, коли ви не можете впевнено змінити чи змінити коефіцієнт, не маючи серйозного ризику або зламати щось, або витратити зайвий час / гроші, щоб нічого не було порушено - тобто коли час, витрати та ризик, пов'язаний із роботою з цим кодом, є непропорційно високий порівняно з перевагами внесення змін (тобто ваш роботодавець або клієнт не втрачають гроші, додаючи нові функції, виправляючи помилки тощо)

Пам’ятайте, що навіть самий диявольський безладний спагетті може бути потенційно досяжним, якщо у вас є достатнє положення навколо безладу, щоб захистити себе від порушення змін (хоча такі випадки рідкісні). Проблема зі спагетті полягає в тому, що захист від порушення змін, як правило, досить дорогий і неефективний, особливо якщо ви робите це заднім часом.

Мабуть, найнадійнішим способом забезпечити написання коду, який можна отримати, є написання (де це можливо) адекватного набору автоматизованих тестів одночасно (при цьому, повністю використовуючи будь-які інші засоби статичного аналізу, які можуть бути доступними).

Вам особливо не потрібно дотримуватися суворої методології розробки, такої як TDD / BDD, щоб в кінцевому підсумку вистачити автоматизованих тестів, які дозволять вам робити рефактор; вам просто потрібно достатньо для захисту коду від випадкових порушень змін у майбутньому.

Якщо ваш код охоплюється автоматизованими тестами, ви можете розслабитися щодо його дизайну та структури, знаючи, що вас охоплюють ці тести; ви можете агресивно змінити рефактор пізніше, або навіть викинути його та почати заново.

Це ставить питання про те, як написати легко перевіряється код; це, як правило, основний аргумент для дотримання принципів SOLID; насправді, відмінною рисою коду, який дотримується принципів SOLID, є те, що його просто та економічно зручно в часі та витратити час.

Звичайно, іноді у вас немає часу і для написання одиничних тестів; однак якщо ви написали весь свій код, пам’ятаючи питання «Як мені написати автоматичні тести для цього?» (навіть якщо ви фактично не реалізували ці тести), ймовірно, вам також вдалося знайти конструкцію, яка є досить досяжною.


1
ми ніколи не встигаємо писати автоматизовані тести, але у нас завжди є час запускати ручні тести знову і знову ...
Нік Кейлі

Крім того, ми ніколи не встигаємо написати код "правильно" та "чисто" вперше, але, здається, у нас є нескінченний час, щоб продовжувати повертатися назад і виправляти його знову і знову через помилково керований, але настільки поширений спосіб мислення, представлений в це повідомлення.
Данк

@Dunk Я не думаю, що його реалістично очікувати, що код ніколи не повинен змінюватися і не переглядатися. Практика тестування підрозділів та рекомендації SOLID стосуються заохочувальних практик, які призводять до того, що код, який легко і дешево змінити, коли трапиться неминуче - наприклад, хтось знаходить справді дивну незрозумілу помилку, яку розробник не врахував у той час, або замовник бачить рішення та зміна вимог, або навіть оригінальний код містив помилки, оскільки розробники - лише людина; а може розробник неправильно зрозумів вимоги або виявив раніше невідомі технічні обмеження ...
Бен Коттрелл

1
@BenCottrell - я повністю згоден. Кодекс завжди потрібно буде переглянути. Однак через це, люди спонукають до того, що потрібно зайняти час, щоб зробити «попередній дизайн» та написати дещо «чистий код» як якийсь збій. Вони використовують мантру "вчасно" та "на бюджет", щоб виправдати поганий код / ​​дизайн. Ви можете використовувати всі "практичні дії", які ви хочете, але він не збирається купувати вас "код, який легко і дешево змінити", не маючи хорошого дизайну і відносно "чистого коду" для початку. Хороший дизайн та «чистий код» матимуть побічний продукт фактичного досягнення поставленої вчасно та бюджетної мети.
Данк

@Dunk Це здається, що ви говорите, що багато розробників просто не переймаються якістю коду, що, як я не вважаю, зазвичай так. Насправді я думаю, що є дві великі проблеми - по-перше, хоча розробники можуть бути тими, хто надає кошторис бюджету та терміну, оцінки можуть легко виявитися помилковими. По-друге, зацікавлені сторони проекту отримують остаточну думку про час / витрати, що означає ризики, бюджети та терміни, що переважають технічні проблеми. З огляду на вибір між "безумовно запізненням / перевитратою бюджету" або "потенційно поганим кодом", я вважаю, що зацікавлені сторони часто обирають останній.
Бен Коттрелл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.