Argumentem przemawiającym za kodem typu „kocioł” jest to, że zmiana go w jednym miejscu wpływa tylko na jeden przepływ kodu. Należy to zrównoważyć z faktem, że najczęściej chcesz, aby zmiana wpływała na każdy fragment kodu, który z niej korzysta. Ale widziałem rzadkie przykłady, które potwierdzają ten argument.
Powiedzmy, że masz fragment kodu, który mówi
public ForTheBar(Foo foo)
{
Bar bar = foo.bar();
return bar.BeFooed();
}
Jest to używane w około 2 miejscach w kodzie.
Pewnego dnia ktoś przychodzi i mówi: „Ok, tylko na tej ścieżce, chcemy, abyś wspiął się na pasek przed zrobieniem go”.
I myślisz „cóż, to jest proste”.
public ForTheBar(Foo foo, bool shouldIGrommit)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
return bar.BeFooed();
}
Następnie użytkownik dodaje nową funkcjonalność i uważasz, że dobrze pasuje do FooTheBar. I sumiennie pytasz ich, czy powinieneś przelecieć ten pasek przed nim, a oni powiedzą „nie, nie tym razem”.
Więc po prostu wywołujesz powyższą metodę.
Ale wtedy twój użytkownik mówi „ok, czekaj, w trzecim przypadku chcemy, abyś Doodle Bar, zanim zadzwonisz do BeFooed”.
Nie ma problemu, myślisz, że mogę to zrobić.
public ForTheBar(Foo foo, bool shouldIGrommit, bool shouldIDoodle)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
if (shouldIDoodle)
{
bar.BeDoodled();
}
return bar.BeFooed();
}
Nagle twój kod staje się coraz mniej wymagający. Być może powinieneś był zaakceptować powtórzone dwa wiersze kodu. Do tej pory będziesz miał trzy fragmenty kodu, każdy o długości 2-3 wierszy i nie wyglądający na powtarzający się.
To powiedziawszy, przeciwdziałbym temu stwierdzeniem „nie jest to częsty przypadek, a kiedy to się dzieje, można zrefaktoryzować”.
Innym argumentem, który ostatnio usłyszałem, jest to, że kod płytki wzorcowej może czasem pomóc w nawigacji kodu. Przykład, o którym rozmawialiśmy, polegał na tym, że usunęliśmy mnóstwo kodu mapowania płyty kotła i zastąpiliśmy go AutoMapper. Teraz argumentowano, ponieważ wszystko opiera się na konwencjach, nie można powiedzieć IDE „gdzie jest ta właściwość ustawiona” i oczekiwać, że się dowie.
Widziałem ludzi, którzy twierdzą podobne rzeczy na temat kontenerów IoC.
Nie mówię, że się z nimi zgadzam, ale mimo to jest to uczciwy argument.