Не робіть цього; це надмірно ускладнить речі, і Ви цього не потребуєте
... це відповідь, яку я написав би тут 2 роки тому. Тепер, хоча, я не такий впевнений; насправді, в останні місяці я почав мігрувати старий код у цей формат, не тому, що мені нічого кращого робити, а тому, що мені справді потрібен був для впровадження нових функцій або зміни існуючих. Я розумію автоматичні відрази інших, які бачать цей код, але я думаю, що це щось, що заслуговує на серйозну думку.
Переваги
Головне серед переваг - можливість змінювати та розширювати код. Якщо ви використовуєте
class Point {
int x,y;
// other point operations
}
замість того, щоб просто пропустити пару цілих чисел навколо, а це, на жаль, багато інтерфейсів, - згодом стає набагато легше додати ще один вимір. Або змінити тип на double
. Якщо ви використовуєте List<Author> authors
або List<Person> authors
замість List<String> authors
цього, пізніше стає набагато простіше додати більше інформації до того, що представляє автор. Якщо записати це так, то здається, що я висловлюю очевидне, але на практиці я був винен, що я багато разів використовував рядки таким чином, особливо у тих випадках, коли це було не очевидно на початку, тоді мені знадобилося б більше, ніж рядок.
На даний момент я намагаюся переробити деякий список рядків, який переплітається в моєму коді, тому що мені там потрібна додаткова інформація, і я відчуваю біль: \
Крім того, я згоден з автором блогу про те , що вона несе більше семантичної інформації , що робить його легше для читача , щоб зрозуміти. Хоча параметри часто дають значущі імена та отримують виділений рядок документації, це часто не трапляється з полями та локальними особами.
Кінцева вигода - це безпека типу , з очевидних причин, але в моїх очах це незначна річ.
Недоліки
Писати потрібно більше часу . Написання невеликого класу - це швидко і легко, але не вимагає особливих зусиль, особливо якщо таких занять потрібно багато. Якщо ви кожні 3 хвилини зупиняєтесь, щоб написати який-небудь новий клас обгортки, це також може стати шкодою для вашої концентрації. Мені б хотілося подумати, що такий стан зусиль зазвичай трапляється лише на першому етапі написання будь-якого фрагменту коду; Я, як правило, швидко отримую досить гарне уявлення про те, які суб'єкти потребують участі.
Він може залучати безліч зайвих сеттерів (або конструкцій) та гетерів . Автор блогу new Point(x(10), y(10))
замість цього дає справді некрасивий приклад new Point(10, 10)
, і я хотів би додати, що використання може також включати такі речі, як Math.max(p.x.get(), p.y.get())
не Math.max(p.x, p.y)
. І довгий код часто вважається важчим для читання, і це справедливо. Але, чесно кажучи, у мене є відчуття, що багато коду переміщує об'єкти навколо, і лише вибрані методи створюють його, і ще менше людей потребують доступу до його суворих деталей (що так і не є OOPy).
Дискусійний
Я б сказав, чи це допомагає читання коду дискусійним чи ні. Так, більше семантичної інформації, але довший код. Так, легше зрозуміти роль кожного місцевого, але складніше зрозуміти, що з ним можна зробити, якщо не піти і не прочитати його документацію.
Як і в більшості інших шкіл програмування думки, я вважаю, що це нездорово сприймати цю крайність. Я не бачу, щоб я колись розділяв координати x і y, щоб вони були різного типу. Я не вважаю Count
за потрібне, коли int
слід вистачити. Мені не подобається unsigned int
використання C - хоча теоретично це добре, воно просто не дає вам достатньо інформації, і забороняє розширювати ваш код пізніше, щоб підтримати цей магічний -1. Іноді вам потрібна простота.
Я думаю, що повідомлення в блозі трохи на крайній стороні. Але в цілому я з болючого досвіду дізнався, що основна ідея, що стоїть за ним, зроблена з правильних речей.
У мене є глибока неприязнь до переробленого коду. Я справді так роблю. Але правильно, я не думаю, що це надмірна інженерія.