Oto problem dotyczący programowania / języka, o którym chciałbym usłyszeć twoje przemyślenia.
Opracowaliśmy konwencje, których większość programistów (powinna) przestrzegać, które nie są częścią składni języków, ale służą do zwiększenia czytelności kodu. Oczywiście są one zawsze przedmiotem dyskusji, ale są przynajmniej niektóre podstawowe koncepcje, które większość programistów uważa za przyjemne. Właściwe nazywanie zmiennych, nazywanie w ogólności, sprawianie, że twoje linie nie są skandalicznie długie, unikanie długich funkcji, enkapsulacji itp.
Jest jednak problem, na który nie znalazłem nikogo, kto komentuje i może to być największa z całej gamy. Problem polega na anonimowości argumentów podczas wywoływania funkcji.
Funkcje wynikają z matematyki, w której f (x) ma jasne znaczenie, ponieważ funkcja ma znacznie bardziej rygorystyczną definicję niż zwykle w programowaniu. Czyste funkcje w matematyce mogą zrobić znacznie mniej niż w programowaniu i są znacznie bardziej eleganckim narzędziem, zwykle przyjmują tylko jeden argument (który zwykle jest liczbą) i zawsze zwracają jedną wartość (również zwykle liczbę). Jeśli funkcja przyjmuje wiele argumentów, prawie zawsze są to tylko dodatkowe wymiary domeny funkcji. Innymi słowy, jeden argument nie jest ważniejszy od innych. Oczywiście są uporządkowane wyraźnie, ale poza tym nie mają uporządkowania semantycznego.
W programowaniu mamy jednak więcej funkcji definiujących swobodę, i w tym przypadku argumentowałbym, że to nie jest dobra rzecz. Często zdarza się, że zdefiniowano taką funkcję
func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}
Patrząc na definicję, jeśli funkcja jest napisana poprawnie, jest całkowicie jasne, co jest. Podczas wywoływania funkcji możesz mieć nawet magię inteligencji / uzupełniania kodu w twoim edytorze IDE / edytorze, która powie ci, jaki powinien być następny argument. Ale poczekaj. Jeśli potrzebuję tego, kiedy piszę rozmowę, czy nie brakuje nam czegoś? Osoba czytająca kod nie ma zalet IDE i dopóki nie przejdzie do definicji, nie ma pojęcia, który z dwóch prostokątów przekazanych jako argumenty jest używany do czego.
Problem idzie nawet dalej. Jeśli nasze argumenty pochodzą z jakiejś zmiennej lokalnej, mogą wystąpić sytuacje, w których nie wiemy nawet, jaki jest drugi argument, ponieważ widzimy tylko nazwę zmiennej. Weźmy na przykład ten wiersz kodu
DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])
Jest to złagodzone w różnych zakresach w różnych językach, ale nawet w językach ściśle typowanych, a nawet jeśli rozsądnie nazywasz swoje zmienne, nawet nie wspominasz o typie zmiennej, gdy przekazujesz ją do funkcji.
Jak to zwykle bywa z programowaniem, istnieje wiele potencjalnych rozwiązań tego problemu. Wiele z nich jest już zaimplementowanych w popularnych językach. Na przykład parametry o nazwie w języku C #. Jednak wszystko, co wiem, ma znaczące wady. Nazewnictwo każdego parametru w każdym wywołaniu funkcji nie może prowadzić do czytelnego kodu. Wydaje się, że może przerastamy możliwości, jakie daje nam programowanie tekstu. Odeszliśmy od tekstu JUST w prawie każdym obszarze, ale nadal kodujemy to samo. Potrzebujesz więcej informacji do wyświetlenia w kodzie? Dodaj więcej tekstu. W każdym razie robi się to trochę stycznie, więc zatrzymam się tutaj.
Jedna odpowiedź, którą dostałem do drugiego fragmentu kodu jest taka, że prawdopodobnie najpierw rozpakujesz tablicę do niektórych nazwanych zmiennych, a następnie użyjesz tych, ale nazwa zmiennej może oznaczać wiele rzeczy, a sposób jej wywoływania niekoniecznie mówi ci, jak powinna być interpretowane w kontekście wywoływanej funkcji. W zakresie lokalnym możesz mieć dwa prostokąty o nazwach leftRectangle i rightRectangle, ponieważ to właśnie one reprezentują semantycznie, ale nie musi rozciągać się na to, co reprezentują, gdy podano je funkcji.
W rzeczywistości, jeśli twoje zmienne są nazwane w kontekście wywoływanej funkcji, to wprowadzasz mniej informacji, niż mogłoby to być potencjalnie w przypadku tego wywołania funkcji i na pewnym poziomie, jeśli prowadzi to do gorszego kodu. Jeśli masz procedurę, w wyniku której powstaje prostokąt przechowywany w rectForClipping, a następnie inną procedurę zapewniającą rectForDrawing, wówczas faktyczne wywołanie DrawRectangleClipped to tylko ceremonia. Linia, która nie znaczy nic nowego, i jest po to, aby komputer wiedział, czego dokładnie chcesz, mimo że już wyjaśniłeś to swoim nazewnictwem. To nie jest dobra rzecz.
Naprawdę chciałbym usłyszeć nowe perspektywy na ten temat. Jestem pewien, że nie jestem pierwszym, który uważa to za problem, więc jak to rozwiązać?