Właśnie przeczytałem jeden z artykułów Joela, w którym mówi:
Ogólnie rzecz biorąc, muszę przyznać, że trochę boję się funkcji językowych, które ukrywają rzeczy . Gdy zobaczysz kod
i = j * 5;… W C wiesz przynajmniej, że j mnoży się przez pięć, a wyniki są przechowywane w i.
Ale jeśli widzisz ten sam fragment kodu w C ++, nic nie wiesz. Nic. Jedynym sposobem, aby dowiedzieć się, co tak naprawdę dzieje się w C ++, jest sprawdzenie, jakie są typy i i j, co można zadeklarować gdzie indziej. To dlatego, że j może być tego typu, który został
operator*przeciążony i robi coś strasznie dowcipnego, gdy próbujesz go pomnożyć.
(Podkreśl moje.) Boisz się cech językowych, które ukrywają rzeczy? Jak możesz się tego bać? Czy ukrywanie rzeczy (zwanych również abstrakcją ) nie jest jedną z kluczowych idei programowania obiektowego? Za każdym razem, gdy wywołujesz metodę a.foo(b), nie masz pojęcia, co to może zrobić. Musisz dowiedzieć się, jakie są ai jakie bsą typy , które mogą być zadeklarowane gdzie indziej. Czy powinniśmy więc zrezygnować z programowania obiektowego, ponieważ zbyt wiele rzeczy ukrywa przed programistą?
A czym się j * 5różni od tego j.multiply(5), co możesz napisać w języku, który nie obsługuje przeciążania operatora? Ponownie musielibyście dowiedzieć się, jaki jest rodzaj metody ji zajrzyj do niej multiply, ponieważ oto jmoże być multiplymetoda, która robi coś strasznie dowcipnego.
„Muahaha, jestem złym programistą, który nazywa metodę multiply, ale to, co faktycznie robi, jest całkowicie niejasne i nieintuicyjne i nie ma absolutnie nic wspólnego z mnożeniem rzeczy”. Czy to scenariusz, który musimy wziąć pod uwagę przy projektowaniu języka programowania? Następnie musimy porzucić identyfikatory z języków programowania, ponieważ mogą wprowadzać w błąd!
Jeśli chcesz wiedzieć, co robi metoda, możesz rzucić okiem na dokumentację lub zajrzeć do wnętrza implementacji. Przeciążenie operatora to tylko cukier syntaktyczny i wcale nie widzę, jak zmienia to grę.
Proszę, oświeć mnie.