Я читаю про поширені запахи коду в книзі "Рефакторинг" Мартіна Фаулера . У цьому контексті мені було цікаво про шаблон, який я бачу в кодовій базі, і тим більше можна об'єктивно вважати його антидіаграмою.
Шаблон - це те, коли об’єкт передається як аргумент одному чи декільком методам, всі вони змінюють стан об'єкта, але жоден з яких не повертає об'єкт. Таким чином, він покладається на пропуск за посилальним характером (у даному випадку) C # /. NET.
var something = new Thing();
// ...
Foo(something);
int result = Bar(something, 42);
Baz(something);
Я вважаю, що (особливо коли методи не названі належним чином), мені потрібно вивчити такі методи, щоб зрозуміти, чи змінився стан об'єкта. Це робить розуміння коду більш складним, оскільки мені потрібно відстежувати кілька рівнів стека викликів.
Я хотів би запропонувати вдосконалити такий код, щоб повернути інший (клонований) об'єкт з новим станом або все, що потрібно для зміни об'єкта на сайті виклику.
var something1 = new Thing();
// ...
// Let's return a new instance of Thing
var something2 = Foo(something1);
// Let's use out param to 'return' other info about the operation
int result;
var something3 = Bar(something2, out result);
// If necessary, let's capture and make explicit complex changes
var changes = Baz(something3)
something3.Apply(changes);
Мені здається, перша модель обрана на припущеннях
- що це менше роботи або вимагає менше рядків коду
- що це дозволяє нам як змінити об’єкт, так і повернути якусь іншу інформацію
- що це більш ефективно, оскільки у нас менше примірників
Thing
.
Я ілюструю альтернативу, але щоб її запропонувати, потрібно мати аргументи проти оригінального рішення. Які, якщо такі є, аргументи можна зробити, щоб зробити так, що оригінальне рішення є антидіаграмою?
І що, якщо що, не так з моїм альтернативним рішенням?