Czytałem o (nie) wygodzie posiadania null
zamiast (na przykład) Maybe
. Po przeczytaniu tego artykułu , jestem przekonany, że byłoby znacznie lepiej do użytkuMaybe
(lub coś podobnego). Jestem jednak zaskoczony, widząc, że wszystkie „dobrze znane” imperatywne lub obiektowe języki programowania nadal używają null
(co pozwala na niekontrolowany dostęp do typów, które mogą reprezentować wartość „nic”), i które Maybe
są najczęściej używane w funkcjonalnych językach programowania.
Jako przykład spójrz na następujący kod C #:
void doSomething(string username)
{
// Check that username is not null
// Do something
}
Coś tu pachnie źle ... Dlaczego powinniśmy sprawdzać, czy argument jest zerowy? Czy nie powinniśmy zakładać, że każda zmienna zawiera odwołanie do obiektu? Jak widać, problem polega na tym, że z definicji prawie wszystkie zmienne mogą zawierać odwołanie zerowe. Co jeśli moglibyśmy zdecydować, które zmienne są „zerowalne”, a które nie? To zaoszczędziłoby nam dużo wysiłku podczas debugowania i szukania „NullReferenceException”. Wyobraź sobie, że domyślnie żaden typ nie może zawierać pustego odwołania . Zamiast tego powiedziałbyś wyraźnie, że zmienna może zawierać odwołanie zerowe , tylko jeśli naprawdę go potrzebujesz. Taki jest właśnie pomysł. Jeśli masz funkcję, która w niektórych przypadkach zawodzi (na przykład dzielenie przez zero), możesz zwrócić aMaybe<int>
, stwierdzając wprost, że wynikiem może być int, ale także nic! To jeden z powodów, dla których wolę Być może zamiast wartości zerowej. Jeśli interesuje Cię więcej przykładów, sugeruję przeczytać ten artykuł .
Fakty są takie, że pomimo wad polegających na domyślnym ustawianiu większości typów na null, większość języków programowania OO faktycznie to robi. Dlatego zastanawiam się nad:
- Jakie argumenty musiałbyś wdrożyć
null
w swoim języku programowania zamiastMaybe
? Czy są w ogóle jakieś powody, czy to tylko „bagaż historyczny”?
Przed udzieleniem odpowiedzi na to pytanie upewnij się, że rozumiesz różnicę między wartością null a Może.
null
lub jego koncepcja nie istnieje (IIRC Haskell jest jednym z takich przykładów).
null
od dłuższego czasu. Nie jest łatwo po prostu to porzucić.