Czy to „robić jedną rzecz na raz”?
Ten komentarz brzmi jak pytanie o ogólną zasadę projektowania. Często pytania na ten temat są bardzo subiektywne i nie jesteśmy w stanie napisać właściwej odpowiedzi. Ostrzegamy, że w tej sprawie możemy zamknąć pytania.
Czasami mamy wyjaśnienie oryginalnego wyboru projektu, ponieważ deweloperzy napisali o nich. Ale nie mam tak ładnej odpowiedzi na to pytanie.
Dlaczego cp
jest tak zaprojektowany?
Problem w tym, że Unix ma ponad 40 lat.
Jeśli tworzysz teraz nowy system, możesz dokonać różnych wyborów projektowych. Ale zmiana Uniksa złamałaby istniejące skrypty, jak wspomniano w innych odpowiedziach.
Dlaczego został cp
zaprojektowany do dyskretnego nadpisywania istniejących plików?
Krótka odpowiedź brzmi „nie wiem” :-).
Zrozum, że cp
to tylko jeden problem. Myślę, że żaden z oryginalnych programów poleceń nie był chroniony przed nadpisywaniem lub usuwaniem plików. Powłoka ma podobny problem podczas przekierowywania danych wyjściowych:
$ cat first.html > second.html
To polecenie również po cichu zastępuje second.html
.
Interesuje mnie, w jaki sposób można przeprojektować wszystkie te programy. Może to wymagać dodatkowej złożoności.
Myślę, że jest to część wyjaśnienia: wczesny Unix podkreślał proste implementacje . Aby uzyskać bardziej szczegółowe wyjaśnienie, patrz „gorsze jest lepsze”, połączone na końcu tej odpowiedzi.
Możesz zmienić, > second.html
aby zatrzymał się z błędem, jeśli second.html
już istnieje. Jednak, jak już wspomnieliśmy, czasami użytkownik nie chce, aby zastąpić istniejący plik. Na przykład może budować złożone polecenie, próbując kilka razy, aż zrobi to, co chce.
Użytkownik może uruchomić rm second.html
najpierw, jeśli zajdzie taka potrzeba. To może być dobry kompromis! Ma kilka własnych wad.
- Użytkownik musi wpisać nazwę pliku dwa razy.
- Ludzie mają też wiele problemów z używaniem
rm
. Więc chciałbym też uczynić rm
bezpieczniejszym. Ale jak? Jeśli rm
pokażemy każdą nazwę pliku i poprosimy użytkownika o potwierdzenie, musi ona teraz napisać trzy wiersze poleceń zamiast jednego. Ponadto, jeśli będzie musiała to robić zbyt często, przyzwyczai się i wpisze „y”, aby potwierdzić bez zastanowienia. Może to być bardzo denerwujące i nadal niebezpieczne.
W nowoczesnym systemie zalecam zainstalowanie trash
polecenia i używanie go zamiast, gdy to rm
możliwe. Wprowadzenie pamięci Trash było świetnym pomysłem np. Dla graficznego komputera dla jednego użytkownika .
Myślę, że ważne jest również zrozumienie ograniczeń oryginalnego sprzętu uniksowego - ograniczona pamięć RAM i miejsce na dysku, wydajność wyświetlana na wolnych drukarkach, a także oprogramowanie systemowe i programistyczne.
Zauważ, że oryginalny Uniks nie miał uzupełniania tabulatorami , aby szybko wypełnić nazwę pliku dla rm
polecenia. (Również oryginalna powłoka Bourne'a nie ma historii poleceń, np. Kiedy używasz klawisza strzałki w górę bash
).
Przy wyjściu drukarki, należy użyć edytora linii opartej ed
. Jest to trudniejsze do nauczenia niż wizualny edytor tekstu. Musisz wydrukować kilka bieżących wierszy, zdecydować, w jaki sposób chcesz je zmienić i wpisać polecenie edycji.
Użycie > second.html
jest trochę jak użycie polecenia w edytorze linii. Efekt, jaki ma, zależy od bieżącego stanu. (Jeśli second.html
już istnieje, jego zawartość zostanie odrzucona). Jeśli użytkownik nie jest pewien aktualnego stanu, oczekuje się, że uruchomi się ls
lub ls second.html
pierwszy.
„Proste wdrożenie” jako zasada projektowania
Istnieje popularna interpretacja projektu Uniksa, która zaczyna się:
Projekt musi być prosty, zarówno pod względem implementacji, jak i interfejsu. Ważniejsze jest, aby implementacja była prosta niż interfejs. Prostota jest najważniejszym czynnikiem przy projektowaniu.
...
Gabriel argumentował, że „Gorzej jest lepiej” produkuje bardziej udane oprogramowanie niż podejście MIT: tak długo, jak początkowy program jest zasadniczo dobry, jego wdrożenie zajmie znacznie mniej czasu i wysiłku i łatwiej będzie dostosować się do nowych sytuacji. Na przykład przenoszenie oprogramowania na nowe maszyny staje się znacznie łatwiejsze. W ten sposób jego użycie rozprzestrzeni się szybko, na długo zanim [lepszy] program będzie miał szansę zostać opracowany i wdrożony (przewaga pierwszego gracza).
https://en.wikipedia.org/wiki/Worse_is_better