Nie przesadzić z DRY

Nie wszystko co kwacze to kaczka

Czasem rzeczy są podobne ale jest to przypadkowe podobieństwo. To są w rzeczywistości różne rzeczy 🙂

Przykład z życia, akurat bardzo niskopoziomowy. Potrzebowałem posklejać takie jakby „ścieżki”, separatorem był underscore (najlepsze polskie tłumaczenie to podłoga) „_”. Przykładowo content_colors_red. Rzuciło mi się, że mamy już napisany kod metody System.IO.Path.Combine(). Można skorzystać z niej, a następnie zamienić separatory folderów na nasze podłogi.

string combine = System.IO.Path.Combine("content", "color", "red");
string replace = combine.Replace('\\', '_');

Coś mi jednak nie do końca podobał się ten pomysł. Skonsultowałem się i usłyszałem że „tak się nie robi, bo to po prostu są inne rzeczy”. Wymagania odnośnie naszego kodu mogą się zmieniać niezależnie od zmian w podejściu do systemu plików w systemie operacyjnym. Prawdopobieństwo zmian jednego i drugiego jest po przeciwnych miejscach skali prawdopodobieństwa. W uproszczeniu pierwsze się na pewno zmieni, drugie na pewno nie. Czasem kod po prostu trzeba skopiować (bardzo rzadko, ale się zdarza).

Zbytnie uzależnianie niezależnych modułów

W większej skali taki problem może być gdy zwiążemy wspólnym kodem zupełnie różne miejsca aplikacji, który tylko przypadkowo kiedyś robiły podobne rzeczy. A teraz nie mogą się samodzielnie rozwijać. Potrzebna zmiana w Module Users wymaga zmiany w tzw Core, która z kolei rozwaliłaby moduł Pictures. Szybkim rozwiązaniem jest rozpięcie tych modułów, ale gdy ktoś zbyt skupia się na DRY może nie chcieć do tego dopuścić.

Piszę te kilka wersów w odpowiedzi (jako moje rozszerzenie) na Refaktoryzator wprawny zmienia kodu smak … w wytrawny.

Update:
Znalazłem dlaczego mam takie a nie inne poglądy na ten temat: Strzeż się współdzielenia

Reklamy
Ten wpis został opublikowany w kategorii Programowanie i oznaczony tagami , . Dodaj zakładkę do bezpośredniego odnośnika.

12 odpowiedzi na „Nie przesadzić z DRY

  1. Pingback: dotnetomaniak.pl

  2. nilp pisze:

    a czemu nie zwykły String.Join? tam zdaje się można podać od razu tą ‚podłogę’ =]

  3. Kuba pisze:

    Tez bym uzyl string.Join. Najelpiej jako extension method string Join(this IEnumerable.., string separator), tak by zapisy wygladal:
    var message = elements.Join(„_”);

  4. @nilp @Kuba Słuszne uwagi, bo trochę uprościłem, już nie pamiętam dokładnie jaki był to przypadek, ale proste string.Join() nie wystarczało.

  5. @Kuba nie robiłbym extension method z tego. Po prostu mało zyskujesz a tworzysz nową metodę. Wołanie string.Join(„_”, elements); jest IMHO całkiem krótkie i czytelne.

    • nilp pisze:

      zależy, jak masz to jako coś w stylu wymagania – że ma być ‚_’ i już, to fajnie na wszelki wypadek i tak mieć w jednym miejscu tworzenie takich potworków =]

      hmmm… jakto String.Join nie mogło, a Combine i Replace już tak? [btw. jakby to miało być multiplatformowe, to byś wtopił chyba 🙂 ]

    • Na prawdę nie pamiętam o co dokładnie chodziło. Życie pokazało, że to nie był najbardziej fortunny przykład… Poprawię się next time 😉
      „[btw. jakby to miało być multiplatformowe, to byś wtopił chyba 🙂 ]” – i to jest właśnie dobry przykład, że z DRY nie można przesadzać, bo pomaga tylko do czasu.

  6. rk pisze:

    „underscore” to „podłoga”? Myślę, że to nie najlepsze tłumaczenie, bo podłoga umysłowi ścisłemu kojarzy się raczej z działaniem matematycznym (http://pl.wikipedia.org/wiki/Pod%C5%82oga_i_sufit), który też ma swój zapis w postaci symbolu. Wiki wskazuje, że tłumaczeniem „underscore” jest po prostu „znak podkreślenia”.

  7. ale czy podłoga nie brzmi śmieszniej? 🙂 Programowanie jest nudne, więc przynajmniej słownictwo dajmy ciekawsze.

  8. szogun1987 pisze:

    Specjalnym przypadkiem kopiowania kodu jest jego statyczne generowanie, którego użycie bywa dobrą praktyką. Przykładem może być Scaffolding w MVC. 50-90% modułów w dużych aplikacjach to CRUD-y z doklejoną odrobiną logiki. Układanie części generowanej w jakieś ogólne mechanizmy z wieloma punktami rozszerzeń stworzyłoby potworka. Z drugiej strony pisanie tego kodu z palca byłoby strasznie nudne.

  9. Pingback: Me z .NET tete-a-tete » Siekierka służy na wyrębach. Nie służy do dłubania w zębach.

  10. Pingback: Me z .NET tete-a-tete » Bacz, bo w gąszczu uogólnień – skryty – rwie uproszczeń strumień.

Możliwość komentowania jest wyłączona.