Najpierw przeczytałem fragment artykułu Edsgera W. Dijkstry z 1974 r. „O roli myśli naukowej”:
Pozwól, że wyjaśnię ci, co według mojego gustu jest charakterystyczne dla każdego inteligentnego myślenia. Chodzi o to, że chce się dogłębnie przestudiować aspekt przedmiotu w oderwaniu dla własnej spójności, cały czas wiedząc, że zajmuje się tylko jednym aspektem. Wiemy, że program musi być poprawny i możemy go studiować tylko z tego punktu widzenia; wiemy również, że powinien on być skuteczny i że tak powiem, możemy zbadać jego skuteczność w innym dniu. W innym nastroju możemy zadać sobie pytanie, czy, a jeśli tak, to dlaczego program jest pożądany. Ale nic nie zyskuje - wręcz przeciwnie! - przez jednoczesne zajęcie się tymi różnymi aspektami. Jest to coś, co czasami nazywam „oddzieleniem obaw”, co nawet jeśli nie jest całkowicie możliwe, jest jeszcze jedyną dostępną techniką skutecznego uporządkowania własnych myśli, o której wiem. Mam na myśli to, że „skupiam uwagę na pewnym aspekcie”: nie oznacza to ignorowania innych aspektów, po prostu oddaje sprawiedliwość temu, że z punktu widzenia tego aspektu drugi jest nieistotny. Jest jednocześnie jedno- i wielościeżkowy.
Widzę współczesne oddzielenie problemów mówiących o modularyzacji twojego kodu. Jednak, czytając powyższy cytat, rozumiem, że skupiasz swój umysł na jednym konkretnym zadaniu na raz, nie koncentrując się jednak na innych aspektach. Nie oznacza to dla mnie koniecznie, że kod musi być podzielony na części modułowe.
To znaczy, powiedzmy, że przed tobą jest kod, który w jednym pliku zawiera pojęcia widoku, repozytorium, kontrolera, obsługi zdarzeń, fabryki itp. W jednym pliku.
Na krótki przykład oto kod, który ma dostęp do danych, i przeglądaj (dane wyjściowe):
$sql = "SELECT * FROM product WHERE id = " . db_input($id);
$row = db_fetch_array(db_query($sql));
<option value="<?=$row['id']?>"<?= $row['ver'] == $row['ver'] ? ' selected="selected"' : '' ?>>Version <?=$row['ver']?></option>
Korzystając z nowoczesnego OO, mogę umieścić dostęp do danych we własnym pliku przy użyciu wzorca repozytorium, kod View może przejść do własnego szablonu pliku i mogę połączyć je ze sobą, aby komunikować się za pośrednictwem kontrolera (lub działania lub procedury obsługi żądań), i mogę dodaj fabrykę, aby tworzyć i łączyć różne zależności. I mogę mieć plik konfiguracyjny, który definiuje te fabryki. Z pewnością jest to krok od pojedynczego pliku-wszystkiego.
Moje pytanie dotyczące rozdzielenia problemów jest takie: czytając cytat Dijkstry, wpadłem na pomysł, że być może niekoniecznie miał na myśli, że rozdzielenie obaw to „modułowe rozdzielenie kodu (na pliki lub ich własne funkcje / metody / itp.)”, i że tym bardziej chciał skupić umysł na aspekcie programu, nie obciążając się skupieniem na innych ważnych, ale jeszcze nieistniejących aspektach, niezależnie od tego, czy są one fizycznie rozdzielone w kodzie, czy nie.
Dlaczego zatem obciążamy się fizycznymi modułowymi wzorcami separacji kodów i wzorami projektowymi? Czy nie wystarczy skupić się na jakimś aspekcie, niezależnie od struktury kodu?
Nie mówię o napisaniu najstraszniejszego kodu spaghetti, a następnie rozważeniu tylko jego aspektu, który prawdopodobnie byłby ciężarem. Ale w końcu, do czego zmierzam, to po co przeprowadzać fizyczną separację kodu, po co dzielić kod na osobne pliki lub fragmenty (metody), skoro nie jest to konieczne do mentalnego skupienia się na aspekcie?
Czy rozdzielenie obaw powinno być ćwiczeniem umysłowym, a nie fizycznym?
Innymi słowy, czy powinno istnieć rozłączenie między mentalnym (skupienie się) a fizycznym (kod na papierze) aspektami programowania?
IF
, WHILE
, FOR
a nie GOTO
. Modułowy = moduły z dobrze zdefiniowanym publicznym interfejsem API ściśle oddzielonym od ukrytej wewnętrznej implementacji i reprezentacji. (Np. Modula, Mesa, Modula-2, Modula-3, później dialekty Pascala ( UNIT
).)