Як я можу сприяти використанню шаблону Builder у своїй команді?


22

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

  • Видалили методи сеттера і зробили всі поля final(я беру " finalдобре" аксіоматично). Як виявилося, сетери використовувались лише в конструкторі, тому це не мало побічних ефектів.
  • Ввів клас Builder

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

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

public void foo(Bar bar){
    //do stuff
    bar.setA(stuff);
    //do more stuff
    bar.setB(moreStuff);
}

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

public void foo(Bar bar){
    try{
        bar.setA(a);
        //enter exception-throwing stuff
        bar.setB(b);
    }catch(){}
}

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

public Bar foo(){
        Builder builder=new Builder();
    try{
        builder.setA(a);
        //dangerous stuff;
        builder.setB(b);
        //more dangerous stuff
        builder.setC(c);
        return builder.build();
    }catch(){}
    return null;
}

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

Компроміс полягав у тому, щоб повернутися до старого рішення, а саме використовувати конструктор без параметрів і встановити все за допомогою сетерів за необхідності. Обґрунтуванням було те, що це рішення відповідає принципу KISS, який міна порушує.

Я новачок у цій компанії (менше 6 місяців) і повністю усвідомлюю, що втратив цю. У мене питання:

  • Чи є ще один аргумент щодо використання Builders замість "старого способу"?
  • Чи пропонується запропонована вами зміна навіть насправді?

але насправді,

  • Чи є якісь поради щодо кращого представлення таких аргументів, коли ви пропонуєте спробувати щось нове?

6
Будівельнику потрібно буде якось встановити значення. Тож це не вирішує основну проблему.
Емі Бланкенсіп

3
Що причина (більш / небезпечно / виключення метання) речі не можуть бути переміщені перед тим викликом setA?
yatima2975

2
Тільки 3 рядки параметрів конструктора? Це не так вже й погано.
pjc50

7
У будь-якій розробці програмного забезпечення завжди є компроміси між складністю та роз'єднанням. Хоча я думаю, що я особисто погоджуюся з вами, що будівельник - це хороше рішення, ваш колега має рацію вагатися з мотивів KISS. Я підтримую програмне забезпечення, яке є надзвичайно складним, і частина причини полягає в тому, що кожен новий прокат йде на шахрайство і каже: "Це дурно, я збираюся робити цю нову справу по-своєму", отже, у нас є 5 рамок для планування. фонові завдання та 8 методів запитів до бази даних. Все добре в помірності, і немає чіткої правильної відповіді у подібних випадках.
Брендон

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

Відповіді:


46

Думаючи, що треба десь почати, я взяв на себе рефакторинг класу власників даних

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

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

Я, можливо, трохи суворо ставився до вас, але я був у протилежному місці: перевірте якийсь код і подумайте, "WTF сталося тут ?!", тільки щоб знайти нового хлопця (його майже завжди новий хлопець) вирішили змінити навантаження речей, виходячи з того, що він вважає "правильним шляхом". Гвинти з історією SCM теж є ще однією основною проблемою.


7
"Сюрприз хороший лише, якщо він передбачає вечірку" , це насправді не так для всіх !! Я б перестав говорити з будь-яким так званим другом, який кинув мені сюрприз будь-чим , особливо вечіркою . З людьми . Тьфу.
Darkhogg

3
Тож якщо кожен шаблон рефакторингу та дизайну, чи кожне рішення типу "Чи я тут використовую аксесуар та мутатор чи модель розробника?" повинно бути схвалено командою, як розробники коли-небудь почуватимуть себе повноваженнями робити правильно? Як ви будете вносити зміни вперед, якщо все має бути розроблено комітетом. Я був у взутті ОП до того, як мені застрягло дотримуватися безглуздого коду (як новий хлопець), який усі інші боялися змінити, оскільки це послідовно . Послідовність - це добре і все, але не за рахунок вдосконалення.
Брендон

11
@Brandon ні, але кожна широкомасштабна зміна, яка вплине на них, повинна. Якщо вам доведеться виправити помилку, це просто ще один біт коду - не велика справа. Якщо ви приймаєте рішення, яке впливає на всіх інших, то принаймні ввічливість розповісти їм, що ви робите. Ви можете домовитись від команди змінити безглуздий код, і тоді ваші зміни стануть новою послідовністю. Вам просто потрібно поговорити з колегами. Немає нічого поганого в тому, щоб сказати: "Я збираюся змінити шалену модель аксесуарів, яку ми всі ненавидимо" і почую, як ваші колеги відповідають "так, час про те, що хтось з цим
розібрався

13
@Brandon є приказка: "Дорога до пекла вимощена добрими намірами". Консистенція не просто гарна , це необхідна ! Уявіть, що намагаєтеся керувати командою розробників, яка спільно керує 20 програмами, кожна з яких написана в іншому стилі та / або архітектурі, оскільки вподобання, сучасні технології, тенденції тощо диктували те, що було найкращим на той час. Змусити команду погодитись, що щось має змінитися, може стати різницею між тим, що нового хлопця приймають, оскільки вони вирішили давню проблему та звільняють його за те, щоб вийти на кавалер із тим, що ви вважаєте найкращим.
DrewJordan

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

21

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

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

Як альтернатива, якщо ситуація вимагає сеттерів: запропонуйте спосіб заморозити свій код, щоб сеттер видав помилку твердження (ака-помилка програміста), якщо ви спробуєте змінити поля після готовності об'єкта.

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

Загальні поради

Старий = поганий, новий = хороший, мій шлях, твій шлях ... такий вид дискусії не є конструктивним.

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

Якимось чином рефакторинг коду пов'язаний з теорією Broken Window : ви вважаєте за потрібне виправити будь-яку проблему так, як ви її бачите (або зробіть записку на пізнішій зустрічі з "покращення якості"), щоб з кодом завжди було приємно працювати, є безпечним і чистим. Ви та ваша команда не маєте однакового уявлення про те, що є "досить добрим". Те, що ви бачите як можливість зробити свій внесок і зробити код краще, добросовісно, ​​напевно бачиться інакше, ніж у існуючої команди.

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

Адже існують нескінченні способи вдосконалити існуючу базу коду, але це коштує часу та грошей. Я міг би подивитися на ваш код, назвати його "старим" і знайти речі, про які можна поглянути. Наприклад: немає формальної специфікації, мало стверджує, можливо , мало коментарів або тести, мало коди покриття, unoptimal алгоритму, занадто багато використання пам'яті, не використовуючи «кращий» можливий дизайн шаблону в кожному конкретному випадку, і т.д. до нескінченності . Але в більшості пунктів, які я хотів би підняти, ви подумаєте: це нормально, мій код працює, на це не потрібно витрачати більше часу.

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

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

Коли ви представляєте свої аргументи, вам доведеться зробити кілька «розумних» перевірок: ви намагаєтесь продати ідею чи самі? Що робити, якщо хтось ще представив це команді? Ви знайдете якісь недоліки в їх міркуваннях? Ви намагаєтесь застосувати якусь загальну найкращу практику чи врахували ви специфіку свого коду?

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


Ти абсолютно правий. Невелике заперечення: Це не "старий шлях" проти "мій новий, супер приголомшливий новий спосіб". Я цілком усвідомлюю, що я можу говорити нісенітницю. Моя проблема полягає в тому, що, продовжуючи використовувати практику програмного забезпечення, всі, хто в компанії вважає жахливими, я можу застоювати як розробника. Таким чином я намагаюся внести якісь зміни, навіть якщо я помиляюся. (Завдання було спровоковано запитом відновити пов'язаний клас)
рат

@rath Чи не розробляються нові бази кодів?
biziclop

@biziclop У стару кодову базу підключаються нові модулі. Я працював над одним недавно. Щасливі дні.
рат

5
@rath Можливо, вам потрібен особистий проект, над яким ви можете працювати у свій час, де ви можете сприяти власній розробці? Я не переконаний і вашим аргументом шаблону "Builder"; здається, що геттери / сетери є цілком нормальним рішенням на основі наданої вами інформації. Пам'ятайте, що ви підзвітні своєму роботодавцю та своїй команді; Ваш пріоритет - переконатися, що будь-яка робота, яку ви виконуєте, приносить користь тим, кому підзвітні.
Бен Коттрелл

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

17

Як я можу сприяти використанню шаблону Builder у своїй команді?

Ви цього не робите.

Якщо ваш конструктор має 3 рядки параметрів, він занадто великий і занадто складний. Жодна модель дизайну цього не виправить.

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


Це великий власник даних Strings та інших примітивів. Ніде немає логіки, навіть не перевіряючи наявність nullі т. Д. Тож це просто розмір, а не складність сама по собі. Я думав, що зробити щось на зразок builder.addA(a).addB(b); /*...*/ return builder.addC(c).build();буде набагато простіше на очі.
рат

8
@rath: Це великий власник даних Strings та інших примітивів. => тоді у вас є інші проблеми, сподіваюся, що ніхто не піклується, якщо поле електронної пошти випадково присвоєно поштову адресу хлопця ...
Matthieu M.

@MatthieuM. Я думаю, одна проблема за раз :)
рат

@rath - Здається, включення хорошої схеми перевірки перевірки було б набагато кориснішим і легшим, ніж намагатися розібратися, як перемістити шаблон дизайнера у вже існуючий код. Десь ще ви сказали, що хочете покращити себе. Навчання, як отримати максимальний виграш за найменші зусилля та наслідки, безумовно, атрибут, який слід розвивати.
Данк

1
У мене є так багато конструкторів, які мають більше параметрів. Необхідно в шаблонах IoC. Погане узагальнення в цій відповіді.
djechlin

16

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

Зверніть це.

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

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

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


2
Frame your thoughts as suggestions and ideas. Get THEM to talk through THEIR ideas before asking questions to make them think about yours+1 для цього проте
Рат

2
@rath Майте на увазі, що інші люди можуть не читати вашої книги. Цілком можливо, що людина, з якою ви ведете дискусію, вважає це конфронтацією, яка може бути контрпродуктивною для ваших цілей.
Ікер

2
@rath: Немає правильного чи неправильного. Просто торгуйте. І частіше за все торги включають більше, ніж код.
Мар'ян Венема

1
@Dunk Все, що існує, - це компроміси. Ми називаємо їх правильними чи неправильними, коли компроміси є кришталево чистими і очевидно з одного боку. Однак розпізнати, коли ці відтінки є неоднозначними, простіше, якщо ми зосередилися на тому, щоб вони були компромісними з самого початку.
btilly

2
Я не знаю жодної "найкращої практики" програмування, яка не має винятків там, де вона не найкраща. Іноді важко знайти ці винятки, але вони завжди є.
btilly

11

Чи є ще один аргумент щодо використання Builders замість "старого способу"?

"Коли у вас новий молоток, все буде схоже на цвях". - це я подумав, читаючи ваше запитання.

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

Чи пропонується запропонована вами зміна навіть насправді?

Важко сказати з цього маленького фрагмента коду. Можливо, це так - вам і вашим колегам потрібно це оцінити.

Чи є якісь поради щодо кращого представлення таких аргументів, коли ви пропонуєте спробувати щось нове?

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


7

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

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

До власне питання

Навіщо використовувати незмінні предмети? Тому що ти знаєш, з чим маєш справу.

Скажімо, у вас є db-з'єднання, яке передається навколо, що дозволяє змінити хост через сетер, то ви не знаєте, що це за з'єднання. Тоді ви знаєте, будучи незмінними.

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

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

Тл; д-р

Видалення сетерів може бути правильним, залежно від класу. Шаблон будівельника не вирішує проблему, а просто приховує її. (Бруд під килимом все ще існує, навіть якщо ви її не бачите)


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

1
idk, що відповісти на твої припущення @Dunk Я не намагався все змінити, я спробував це почистити. І не люди знали, що вони там роблять, вони з гордістю створювали класи та функції, що там, де сто рядків коду, з idk скільки штатів, глобальних і так далі .. рівень був ближчий до kinder vrt imo. Тож я стою біля своєї заяви. Ніколи не відступайте, коли помічаєте, що ви перебуваєте в положенні, коли вам доведеться перейняти погану практику, щоб вписатися.
супергерой

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

Вам не доведеться "назавжди" працювати з кодом, який є сміттям, або слідувати поганій практиці, просто тому, що це робиться. Однак, якщо ви хочете досягти успіху в зміні речей, то вам краще спочатку довести свою довіру як мінімум. Майже кожен розробник думає, що код, який він успадковує, - це сміття. Якщо кожна компанія щоразу щойно погоджувалася з новим хлопцем, навіть не знаючи їх справжнього рівня майстерності, сміття перетвориться на смітник. Крім того, ви повинні витратити час, щоб зрозуміти, чому все робиться таким, яким вони є. Іноді «неправильний» спосіб є «правильним» способом для конкретної ситуації.
Данк

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

2

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

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

// business objects

interface CharRange {
   public char getCharacter();
   public int getFrom();
   public int getTo();
}

class MultiCharRange implements CharRange {
   final char ch;
   final int from;
   final int to;

   public char getCharacter() { return ch; }
   public int getFrom() { return from; }
   public int getTo() { return to; }
}

class SingleCharRange implements CharRange {
   final char ch;
   final int position;

   public char getCharacter() { return ch; }
   public int getFrom() { return position; }
   public int getTo() { return position; }
}

// builders

class Builder1 {
   public Builder2 character(char ch) {
      return new Builder2(ch);
   }
}

class Builder2 {
   final char ch;
   int from;
   int to;

   public Builder2 range(int from, int to) {
      if (from > to) throw new IllegalArgumentException("from > to");
      this.from = from;
      this.to = to;
      return this;
   }

   public Builder2 zeroStartRange(int to) {
      this.from = 0;
      this.to = to;
      return this;
   }

   public CharRange build() {
      if (from == to)
         return new SingleCharRange(ch,from);
      else 
         return new MultiCharRange(ch,from,to);
   }
}

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

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

  • Чи ми інстанціюємо об'єкт лише з одного чи двох місць? Це, можливо, зміниться?
  • Може, нам слід застосувати ці обмеження, переробляючи оригінальний об'єкт на композицію з менших об'єктів?
  • Чи вдасться ми передати будівельника від методу до методу?
  • Чи можемо ми замість цього використати статичний заводський метод?
  • Це частина зовнішнього API, яка повинна бути максимально надійною та гладкою?
  • Приблизно, скільки нашого поточного відставання помилок можна було б уникнути, якби у нас були будівельники?
  • Скільки додаткової написання документації ми б заощадили?

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


1
перетворивши створення об’єкта в процес, можна застосувати складні логічні обмеження. БАМ. І все, що це означає про складність, коли вона організована в менші, дискретні, простіші кроки.
radarbob

2

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

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

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

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


Це, безумовно, не дизайн комітетом, який є частиною причини, по якій код так сильно смердить. Я думаю, що надто багато хорошого. Це є DTO , але я не розбити його на шматки; якщо база коду погана, БД набагато, набагато гірше. +1 (головним чином) за останній абзац.
рат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.