Usunięcie zakodowanych wartości i defensywnego projektu w porównaniu z YAGNI

10

Najpierw trochę tła. Piszę odnośnik z Wiek -> Stawka. Istnieje 7 przedziałów wiekowych, więc tabela przeglądowa składa się z 3 kolumn (od | do | stawki) z 7 wierszami. Wartości rzadko się zmieniają - są to stawki legislacyjne (pierwsza i trzecia kolumna), które pozostają takie same od 3 lat. Doszedłem do wniosku, że najłatwiejszym sposobem przechowywania tej tabeli bez zakodowania na stałe jest w bazie danych w globalnej tabeli konfiguracji, jako pojedyncza wartość tekstowa zawierająca CSV (więc „65,69,0.05,70,74,0.06” to poziomy 65-69 i 70-74 będą przechowywane). Stosunkowo łatwy do przeanalizowania, a następnie użycia.

Potem zdałem sobie sprawę, że aby to zaimplementować, będę musiał utworzyć nową tabelę, repozytorium do owijania go, testy warstwy danych dla repo, testy jednostkowe wokół kodu, który rozpakowuje CSV do tabeli, i testy wokół samego wyszukiwania. Jedyną zaletą całej tej pracy jest unikanie twardego kodowania tabeli odnośników.

W rozmowie z użytkownikami (którzy obecnie korzystają bezpośrednio z tabeli odnośników - patrząc na papierową wersję) istnieje opinia, że ​​„stawki nigdy się nie zmieniają”. Oczywiście to nie jest poprawne - stawki zostały utworzone dopiero trzy lata temu, a w przeszłości rzeczy, które „nigdy się nie zmieniają” miały nawyk zmiany - więc dla mnie, aby programować defensywnie, zdecydowanie nie powinienem przechowywać tabeli odnośników w Aplikacja.

Z wyjątkiem sytuacji, gdy myślę YAGNI . Wdrożona przeze mnie funkcja nie określa zmian stawek. Jeśli stawki się zmieniają, nadal będą się zmieniać tak rzadko, że konserwacja nawet nie jest brana pod uwagę, a funkcja nie jest tak naprawdę na tyle ważna, że ​​wszystko zmieniłoby się, gdyby nastąpiło opóźnienie między zmianą stawki a zaktualizowaną aplikacją.

Prawie zdecydowałem, że nic wartościowego nie zostanie utracone, jeśli zaprogramuję wyszukiwanie na stałe i nie martwię się zbytnio moim podejściem do tej konkretnej funkcji. Moje pytanie brzmi: czy jako profesjonalista właściwie uzasadniłem tę decyzję? Wartości na sztywno to zły projekt, ale problem z usunięciem wartości z aplikacji wydaje się naruszać zasadę YAGNI.

EDYCJA Aby wyjaśnić pytanie, nie martwię się o faktyczną implementację. Obawiam się, że mogę albo zrobić szybką, złą rzecz, i uzasadnić to, mówiąc YAGNI, albo też przyjąć bardziej defensywne, wymagające dużo wysiłku podejście, które nawet w najlepszym przypadku ostatecznie przynosi niewielkie korzyści. Czy jako profesjonalny programista moja decyzja o wdrożeniu projektu, który według mnie jest wadliwy, sprowadza się po prostu do analizy kosztów i korzyści?

EDYCJA Podczas gdy wszystkie odpowiedzi były bardzo interesujące, ponieważ myślę, że sprowadza się to do indywidualnych wyborów projektowych, myślę, że najlepsze odpowiedzi to @ Corbin i @EZ Hart, ponieważ poruszają rzeczy, których nie rozważałem w pytaniu:

  • fałszywa dychotomia „prawidłowego usuwania zakodowanych wartości” poprzez przeniesienie jej do bazy danych w porównaniu z „wydajnym zastosowaniem YAGNI” przy użyciu zakodowania na stałe. Istniała trzecia opcja umieszczenia tabeli odnośników w konfiguracji aplikacji, która nie wiąże się z koniecznością poprawnego działania i bez wydajności YAGNI. Zasadniczo nie ograniczamy się do decyzji / decyzji, a sprowadza się to do decyzji o kosztach / korzyściach.
  • generowanie kodu może zmniejszyć obciążenie związane z przenoszeniem zakodowanych wartości do bazy danych, a także w sposób, który usuwa również moją nadmiernie inżynierską decyzję o przetwarzaniu pliku CSV do tabeli. Potencjalnie powoduje to również problem z długoterminową konserwacją wygenerowanego kodu, jeśli podstawowe wymagania zmienią się dla metody wyszukiwania. Wszystko to wpływa tylko na analizę kosztów i korzyści i jest prawdopodobne, że gdybym miał dostęp do tej automatyzacji, nie rozważyłbym nawet takiego kodowania na sztywno.

Zaznaczam odpowiedź @ Corbina jako poprawną, ponieważ zmienia ona moje założenia dotyczące kosztów rozwoju i prawdopodobnie w najbliższej przyszłości dodam do mojego arsenału narzędzia do generowania kodu.

Rebecca Scott
źródło
Nie zapominaj, że jeśli stawki się zmieniają, a wszystko, co masz, to wartości zakodowane na stałe, możesz zepsuć obliczenia rekordów historycznych, gdy stawki się zmienią (i tak się stanie, niezależnie od tego, co mówi ci klient).
Andy,

Odpowiedzi:

6

Znalazłeś wadę w swoim procesie rozwoju. Gdy wykonanie właściwego zadania (tworzenie tabeli, repo, testy repo, spłaszczanie testów ...) jest trudne, programiści znajdą sposób na obejście tego. Zwykle wiąże się to z niewłaściwym postępowaniem. W takim przypadku kuszące jest traktowanie danych aplikacji jako logiki aplikacji. Nie rób tego Zamiast tego dodaj przydatne automatyzacje do swojego procesu programowania. Używamy CodeSmith do generowania nudnego kodu, którego nikt nie chce pisać. Po utworzeniu tabeli uruchamiamy CodeSmith, który generuje DAO, DTO i usuwa testy jednostkowe dla każdego z nich.

W zależności od używanych technologii powinieneś mieć podobne opcje. Wiele narzędzi ORM wygeneruje modele na podstawie istniejącego schematu. Migracje po szynach działają w przeciwnym kierunku - tabele z modeli. Metaprogramowanie w językach dynamicznych jest szczególnie skuteczne w eliminowaniu kodu bojlera. Będziesz musiał pracować trochę ciężej, aby wygenerować wszystko, czego potrzebujesz, jeśli masz złożoną aplikację wielowarstwową, ale warto. Nie pozwól, aby uczucie „wow, to jest ból szyi” powstrzymuje cię przed zrobieniem właściwej rzeczy.

Aha, i nie przechowuj danych w formacie wymagającym dodatkowego przetwarzania (CSV). To tylko dodatkowe kroki, które wymagają Twojej uwagi i testowania.

Corbin March
źródło
Nie powiedziałbym, że migracja Railsów tworzy tabele z modeli ... Migracje Railsów opisują zmiany w tabelach. Wykonanie migracji zmienia bazę danych. Właściwości modelu pasujące do struktury tabeli są tworzone w czasie wykonywania.
kevin cline,
To mnie interesuje, nie zastanawiałem się nad zautomatyzowaniem części początkowego wysiłku do tego poziomu. Posiadanie tej automatyzacji oznaczałoby, że mógłbym ustawić pełny stół, zamiast korzystać z CSV, aby zaoszczędzić czas. Martwię się o długoterminowe utrzymanie wygenerowanego kodu. Generując go z góry, wcześnie założyłem, że metoda wyszukiwania nigdy się nie zmieni. Myślę, że jeśli jest taka możliwość, powinienem wziąć to pod uwagę jako część kosztów / korzyści, biorąc pod uwagę obniżony koszt płyty kotłowej. +1
Rebecca Scott
Pytanie brzmiało: „czy powinienem zakodować na stałe wartości, kiedy mój klient mówi, że się nie zmienią?” a twoja odpowiedź brzmi „nie, i powinieneś rzucić ORM na problem”. Nie zgadzam się. Istnieją prostsze opcje, które pozwoliłyby OP uniknąć twardego kodowania. Wprowadzanie dużych dodatków do architektury w celu obsługi rzeczy wyraźnie uznanych za niepotrzebne jest nieetyczne. Szkoda, że ​​wielu programistów jest predysponowanych do takich rzeczy. I muszę powiedzieć, że nie zgadzam się w 100% z twoją sugestią, aby „nie pozwalać, aby uczucie, łał, to ból w szyi,„ powstrzymuje cię od robienia właściwych rzeczy ”. Te uczucia mają znaczenie!
user1172763,
10

Aby odpisać i rozszerzyć odpowiedź @ Thorbjørn Ravn Andersen: Utrzymanie obliczeń / wyszukiwania w jednym miejscu to dobry początek.

Twój proces myślowy defensywny kontra YAGNI jest częstym problemem. W tym przypadku sugerowałbym, aby poinformowały go dwie dodatkowe rzeczy.

Po pierwsze - w jaki sposób przedstawiono wymagania użytkownika? Czy określono możliwość edytowania stawek? Jeśli nie, to czy dodatkowa złożoność jest częścią czegoś, za co możesz zapłacić, czy nie? (lub jeśli masz pracowników, że zamiast tego możesz poświęcić czas na inną pracę?) Jeśli tak, to zdecydowanie idź dalej i dostarcz to, o co rozsądnie poproszono.

Po drugie, a może co ważniejsze, sama edytowalność raczej nie spełni rzeczywistych wymagań w obliczu zmiany przepisów. Jeśli i kiedy stawki się zmienią, najprawdopodobniej nastąpi data obniżki i pewne przetwarzanie przed i po, które musi nastąpić. Co więcej, jeśli ten sam interfejs musi następnie wykonać jakiekolwiek przeterminowane przetwarzanie roszczeń, może być konieczne sprawdzenie poprawnej stawki w oparciu o datę wejścia w życie, a nie faktyczną datę.

Krótko mówiąc, zauważam, że rzeczywiste edytowalne wymaganie może być dość złożone, więc dopóki nie zostanie dopracowane, proste jest prawdopodobnie lepsze.

Powodzenia

sdg
źródło
1
+1 za drugi punkt. Nie próbuję odgadnąć, co mogą zrobić organy ustawodawcze w przyszłości.
David Thornley,
Zrób to w funkcji biblioteki. Można mieć tylko jednego użytkownika. Kiedy i jeśli zmieniają się wymagania, masz jedno miejsce do zmiany. (Może być konieczne dodanie funkcji do wyszukiwania wartości dla określonej daty.)
BillThor
Najlepsza i najbardziej kompletna odpowiedź, +1
Andy
7

Ustaw faktyczne wyszukiwanie jako funkcję biblioteki. Następnie możesz zobaczyć cały kod korzystający z tego wyszukiwania w repozytorium źródłowym, dzięki czemu wiesz, które programy należy zaktualizować, gdy stawki się zmienią.


źródło
Wyszukiwanie zostanie zaimplementowane tylko w jednym miejscu (może coś w rodzaju PensionRateLookupklasy), a następnie zostanie użyte globalnie. Zrobiłbym to bez względu na to, czy jest przechowywany poza aplikacją, czy na stałe, w ten sposób PensionRateLookupzachowana musi być tylko implementacja klasy. Mój problem polega na tym, jak wykorzystałem YAGNI, aby dojść do wniosku, że zakodowanie na stałe tabeli odnośników jest dopuszczalne.
Rebecca Scott,
Dziękuję za odpowiedź. Utrzymanie implementacji wyszukiwania w jednym miejscu jest zdecydowanie dobrym projektem.
Rebecca Scott,
YAGNI jest ważny tylko wtedy, gdy możesz wysyłać nowe pliki binarne, gdy stawki ulegną zmianie. Jeśli nie możesz, ale możesz zmienić konfigurację, ustaw ją jako wartość konfiguracyjną odczytywaną przy uruchamianiu z bieżącą reprezentacją tekstową jako domyślną.
Wysyłam nową wersję zwykle co tydzień, więc faktyczna aktualizacja nie stanowi problemu. Umieszczenie go w konfiguracji klienta jest w rzeczywistości gorsze, ponieważ nie mogę zmienić konfiguracji klienta za pomocą nowego pliku binarnego. Alternatywą, którą widzę, jest umieszczenie jej w bazie danych, co oznacza duży wysiłek.
Rebecca Scott,
Więc w czym problem? Kiedy stawki się zmieniają, aktualizujesz kod i wysyłasz do wszystkich klientów?
2

Pokaż mi, czy dobrze zrozumiałem twoje pytanie. Masz 2 opcje zaimplementowania funkcji: albo kodujesz wartość, a twoja funkcja jest łatwa do implementacji (ale nie podoba ci się część kodu) lub masz bardzo duży wysiłek, aby „przerobić” wiele rzeczy, które zostały zrobione dzięki czemu możesz rozwijać swoją funkcję w czysty sposób. Czy to jest poprawne?

Pierwszą rzeczą, jaka przychodzi mi na myśl, jest: „Najważniejszą rzeczą w znajomości dobrych praktyk jest wiedza, kiedy lepiej sobie bez nich radzić”.

W tym przypadku wysiłek jest bardzo wysoki, więc możesz to zrobić w czysty sposób, szanse na efekt uboczny tej zmiany są duże, a zwrot, który otrzymasz, jest niewielki (jak wyjaśniłeś, wydaje się prawdopodobne, że nie będzie zmiana).

Użyłbym podejścia opartego na twardym kodzie (ale przygotowuję go do elastyczności w przyszłości), a w przypadku zmiany tej stawki w przyszłości skorzystam z okazji, aby przefiltrować całą tę wadliwą część kodu. Tak więc czas i koszt można oszacować poprawnie, a koszt zmiany wartości zapisanej na stałe byłby minimalny.

To byłoby moje podejście :)

JSBach
źródło
Dzięki @Oscar. Techniczną częścią tego jest def. poprawny. Zgadzam się z tym, jak podejdziesz do problemu, dokonując refaktoryzacji tylko wtedy, gdy jest to potrzebne. Mówisz więc, że jako profesjonalista możemy i powinniśmy wybierać nasze zasady projektowania, oparte wyłącznie na stosunku kosztów do korzyści? Ma sens.
Rebecca Scott,
@Ben Scott: Nie ma za co :). Tak, moim zdaniem, zasady projektowania zostały utworzone / skatalogowane nie dlatego, że wyglądają pięknie, ale dlatego, że przynoszą korzyści takie jak „czystość” kodu, elastyczność, solidność itp. Ale zawsze są 2 pytania: 1- Czy potrzebuję tego ? 2- Czy moje ograniczenia (czasowe, techniczne itp.) Pozwalają mi je wdrożyć? To zazwyczaj prowadzi mnie do wyboru zasady projektowania. Nadmierna inżynieria jest również zła;) ps: jeśli uważasz, że jest to interesująca odpowiedź, zagłosuj, aby inne osoby również przeczytały ją z większym prawdopodobieństwem. Dzięki! :)
JSBach
pozytywnie przyjęty ;-)
Rebecca Scott,
2

Jest to przedmiot, który „nie zmieni się”, dopóki się nie zmieni. To nieuniknione, że to się zmieni, ale ten czas może być trochę daleki.

Twoje uzasadnienie jest prawidłowe. W tej chwili klient nie prosił o możliwość łatwej zmiany tych stawek. Jako taki, YAGNI.

Jednak to, czego nie chcesz, to kod, który uzyskuje dostęp do twoich stawek i interpretuje wyniki rozproszone w całej bazie kodu. Dobry projekt OO pozwoliłby zawrzeć wewnętrzną reprezentację swoich stawek w klasie i ujawnić tylko jedną lub dwie metody niezbędne do wykorzystania danych.

Będziesz potrzebował tej enkapsulacji, aby zapobiec błędom kopiowania i wklejania, lub będziesz musiał dokonać refaktoryzacji w całym kodzie, który wykorzystuje stawki, gdy musisz zmienić wewnętrzną reprezentację. Po podjęciu tej wstępnej ostrożności, bardziej skomplikowanym podejściem może być prosta zamiana i zamiana na bardziej funkcjonalną wersję.

Dodatkowo przywołaj klientowi ograniczenie obecnego projektu. Powiedz im, że w celu utrzymania harmonogramu zakodowałeś wartości na stałe - co wymaga zmiany kodowania, aby je zaktualizować. W ten sposób, gdy dowiedzą się o oczekujących zmianach stawek wynikających z nowych przepisów, mogą po prostu zaktualizować tabelę wyszukiwania lub dokonać bardziej skomplikowanej zmiany w tym czasie. Ale postaw tę decyzję na ich kolanach.

Berin Loritsch
źródło
Dzięki @berin, nie wspomniałem o SRP w pytaniu, ale było to w planie. Warto ponownie przekazać klientowi własność problemu.
Rebecca Scott,
Obarczanie winą za to, że w przyszłości coś pójdzie nie tak, nie wydaje mi się profesjonalne.
Andy,
@Andy, jaka część tego jest obwinianiem? Przedstawienie klientowi ograniczeń projektowych pozwala mu ustalić priorytet skomplikowanej pracy teraz i zdjąć inne rzeczy ze stołu, przesunąć termin lub zaakceptować ograniczony projekt teraz, ponieważ inne rzeczy na stole są dla niego ważniejsze. Dajesz swojemu klientowi wybór w stosunku do jego produktu. Uświadomienie klientowi ryzyka / korzyści z wyborów, które chcesz podjąć w jego interesie, sprawi, że projekt będzie przebiegał płynniej.
Berin Loritsch
@BerinLoritsch Ale ta konkretna decyzja projektowa jest podobna do używania części niespełniających norm, mówiąc: „Mogę użyć kitu hydraulicznego do zatkania tej nieszczelnej rury, to twoja najtańsza opcja!” Stawki BĘDĄ zmienione. To oczywiste i nieodpowiedzialne dla profesjonalisty zbudowanie systemu, który na to nie pozwala. Oszczędności są prawdopodobnie znikome w wielkim schemacie kosztów projektu. Umieść dane w tabeli; kod, który pobiera dane wyszukiwania, jest nieco inny, logika ustalania, którą szybkość użyć, jest taka sama w obu przypadkach. Jedyną inną decyzją jest sposób postępowania z danymi historycznymi po ...
Andy
stawki zmieniają się, co zwykle wykonuje się przez skopiowanie stawki do odpowiedniego rekordu. W tym momencie nie jest potrzebny ekran administratora, system może wtedy obsłużyć zmiany stawek i będzie to prosty skrypt, aby je zmienić. Nie powinno to trwać dłużej niż kilka godzin, ale zapobiegnie zalaniu piwnicy w przyszłym roku, gdy kit się zawiedzie.
Andy
2

Podziel różnicę i ustaw dane szybkości w ustawieniach konfiguracji. Możesz użyć formatu CSV, który już masz, unikniesz zbędnego obciążenia bazy danych, a jeśli zmiana będzie kiedykolwiek konieczna, będzie to zmiana, którą klient powinien wprowadzić bez konieczności ponownej kompilacji / ponownej instalacji i bez bałaganu w bazie danych - mogą po prostu edytować plik konfiguracyjny.

Zwykle, gdy patrzysz na wybór między dwiema skrajnościami (naruszenie YAGNI vs. kodowanie dynamicznych danych), najlepsza odpowiedź jest gdzieś pośrodku. Uważaj na fałszywe dychotomie.

Zakłada się, że cała konfiguracja jest w plikach; jeśli jest to coś trudnego, np. rejestr, prawdopodobnie należy zignorować tę radę :)

EZ Hart
źródło
Zastanawiałem się nad ustawieniem konfiguracji, ale odłożyłem to na bok, ponieważ użytkownicy nie są zbyt techniczni, jeśli chodzi o edycję łańcucha CSV, więc to ja aktualizuję konfigurację dla N użytkowników (ponieważ wykonuję całą obsługę IT w org)), pod względem nakładu pracy łatwiej byłoby wykonać pracę z góry, aby dostać się do bazy danych, którą mogę administrować z jednego miejsca. Przypuszczam, że gdyby to nie było rozważanie (gdyby użytkownicy byli w stanie zarządzać swoją indywidualną konfiguracją) nie miałbym tego problemu. Więc bardzo dobra uwaga, dziękuję.
Rebecca Scott,
Jeśli połączysz to z innymi sugestiami scentralizowanej logiki, to świetna odpowiedź. To czysto zło, aby naprawdę przeszukiwać wyszukiwanie, a nie wprowadzać go w sposób umożliwiający jego zmianę za pomocą config. Za każdym razem, gdy spotka się z nim inny programista, będą cię za to nienawidzić. Nawet jednoosobowy programista powinien rozważyć, co się stanie, jeśli zostanie potrącony przez autobus, i powinien ułatwić następnemu deweloperowi zmianę wartości bez pełnej wersji oprogramowania. Tylko jeśli nienawidzisz klienta i nienawidzisz wszystkich innych programistów, powinieneś go hardcore'ować. W zasadzie nigdy.
simbo1905
2

Doszedłem do wniosku, że najłatwiejszym sposobem przechowywania tej tabeli bez zakodowania na stałe jest w bazie danych w globalnej tabeli konfiguracji, jako pojedyncza wartość tekstowa zawierająca CSV (a więc „65,69,0.05,70,74,0.06” to poziomy 65-69 i 70-74 zostałyby zapisane.

Właśnie utworzyłem tabelę DB. (Czy myślałeś o przechowywaniu całego stołu w jednym pliku, oszalałeś?)

Tabela wymaga 2 pól NIE 3. Wiek i stawka. Ten następny wiersz zawiera górną wartość! Dezormalizujesz się, nawet o tym nie wiedząc!

Oto Sql, aby uzyskać stawkę dla osoby w wieku 67 lat.

Select * from RateTable where Age in (Select max(age) from RateTable where age <=67) 

Nie zawracaj sobie głowy tworzeniem ekranu konserwacji, ponieważ jest on poza zasięgiem. Jeśli poproszą o to później, wydaj prośbę o zmianę i zrób to.

EDYCJA: Jak powiedzieli inni, zachowaj kod, a centrala stawki zostanie scentralizowana, na wypadek gdyby cała struktura stawek uległa zmianie.

Kretynowie
źródło
Cześć @ Morons, dziękuję za odpowiedź. Tabela faktycznie potrzebowałaby 3 kolumn. Jest to jedna stawka dla przedziału wiekowego, od minimalnego wieku do maksymalnego wieku (od 65 do 69 lat wynosi 5%). Przechowuję tylko niewielką ilość danych w ograniczonym celu, więc co jest złego w zakładaniu, że struktura i wybranie pliku CSV zamiast całej dedykowanej tabeli? Prawdopodobnie dodałbym ogranicznik wierszy i podzieliłem wiersz, następnie kolumnę i wciągnąłem kolumny do wymaganych pól. To zawsze będzie czytane o wiele więcej niż napisane, więc nie martwię się zbytnio o pełny stół.
Rebecca Scott,
Następny wiersz zawiera górną wartość zakresu ... To jest duplikacja danych. Mówienie <69 i> 7 to to samo. Jedynym powodem posiadania obu wartości jest to, że zakres może zawierać otwory. ... Mówię o użyciu stołu, ponieważ jest to łatwiejsze (i lepszy projekt). Nie rozumiem, dlaczego uważasz, że przechowywanie pliku csv w tabeli pozwoli Ci zaoszczędzić czas lub wysiłek. Nadal potrzebujesz wywołania DB, aby uzyskać ten ciąg, a następnie musisz go przeanalizować. Jak pokazałem powyżej, możesz uzyskać stawkę za pomocą jednego połączenia DB.
Morons,
Ach, prawda. Utrzymywałem sam stół podobny do materiału źródłowego ... i tęskniłem za tym, że wiek jest górną granicą w twojej odpowiedzi, ponieważ miałem ojców, których ci dałem.
Rebecca Scott,
1
„Demoralizujesz, nawet o tym nie wiedząc!” - na początku myślałem, że to literówka i że miałeś na myśli „denormalizowanie”, ale im dłużej o tym myślałem, tym bardziej wydawało się, że i tak masz rację :)
EZ Hart
@ez hart LOL true.
Rebecca Scott,
1

Zgadzam się z większością udzielonych odpowiedzi. Dodam także, że spójność z resztą aplikacji jest ważna. Jeśli jest to jedyne miejsce w kodzie, które ma zakodowane wartości, prawdopodobnie zaskoczy opiekunów. Jest to szczególnie prawdziwe, jeśli jest to duża, stabilna baza kodu. Jeśli jest to mały program obsługiwany przez ciebie, decyzja jest mniej ważna.

Mam daleką pamięć o czytaniu dobrze znanego zwinnego / OOP faceta (takiego jak Dave Thomas, Kent Beck czy ktoś), mówiącego, że ich podstawową zasadą przy powielaniu kodu było dwa i tylko dwa razy: nie refaktoryzuj za pierwszym razem, gdy coś powielisz możesz napisać to tylko dwa razy w swoim życiu. Ale trzeci raz ...

To nie do końca odnosi się do pytania, ponieważ kwestionujesz YAGNI, ale myślę, że dotyczy ogólnej elastyczności zwinnych zasad. Celem zwinności jest dostosowanie się do sytuacji i pójście naprzód.

Dave
źródło
Dzięki @Dave, to jest pomocne. Od samego początku jestem jedynym opiekunem, ale jest to duża, stosunkowo stabilna baza kodu (tysiące plików, ponad 100 tabel itp.) I wciąż jestem ciągle zaskoczona (i przerażona). Spójność jest zdecydowanie jednym z moich celów na przyszłość.
Rebecca Scott,
0

Twardy kod w funkcji.

  • Kiedy wartości się zmieniają, możesz ponownie wystawić rachunek klientowi
  • Kiedy wartości się zmieniają, są szanse, że format tabeli będzie musiał się zmienić, wykonanie CSV będzie marnować czas
  • Łatwiejsze do wdrożenia, większe szanse na realizację budżetu przy obecnym kontrakcie
  • Można łatwo znaleźć, kiedy będzie trzeba go zaktualizować
EarlNameless
źródło
Pozwól mi zainstalować tę niespełniającą norm wartość, więc kiedy z pewnością zepsuje się w ciągu roku, dostaję powtarzające się interesy. To brzmi podejrzanie, bo tak jest.
Andy,