Joel'in yazdığı yazılardan birini okudum :
Genel olarak, bazı şeyleri gizleyen dil özelliklerinden biraz korktuğumu itiraf etmeliyim . Kodu gördüğünde
i = j * 5;
… C'de, en azından, j'nin beşle çarpıldığını ve sonuçların i'de depolandığını biliyorsunuz.
Ama aynı kod parçasını C ++ 'da görürseniz, hiçbir şey bilmiyorsunuzdur. Hiçbir şey değil. C ++ 'da gerçekte neler olduğunu bilmenin tek yolu, i ve j türlerinin ne olduğunu, başka bir yerde bildirilebilecek bir şeyi bulmaktır. Bunun nedeni, j'nin
operator*
aşırı yüklenmiş bir türde olması ve çoğaltmaya çalıştığınızda çok esprili bir şey yapmasıdır.
(Vurgu benim.) Şeyleri gizleyen dil özelliklerinden korkuyor musun? Bundan nasıl korkarsın? Nesnelere yönelik programlamanın temel fikirlerinden birini gizlemek ( soyutlama olarak da bilinir ) değil mi? Ne zaman bir yöntem çağırırsan a.foo(b)
, neler yapabileceği hakkında hiçbir fikrin yok. Ne tür a
ve ne b
olduğunu, başka bir yerde bildirilebilecek bir şeyi bulmanız gerekir. Öyleyse, programcıdan çok fazla şey gizlediği için nesne yönelimli programlama yapmalı mıyız?
Ve operatörün aşırı yüklenmesini desteklemeyen bir dilde yazmanız gerekebilecek j * 5
olandan farklı j.multiply(5)
olan nedir? Yine, yöntemin türünü j
ve gözünü bulmak zorunda kalacaksınız multiply
, çünkü bakalım, çok esprili bir şey yapan j
bir multiply
yönteme sahip bir tür olabilir .
“Muahaha, ben bir metodu adlandıran şeytani bir programcıyım multiply
, fakat aslında yaptığı şey tamamen belirsiz ve sezgisel değil ve kesinlikle çoğaltan şeyle hiçbir ilgisi yok.” Bir programlama dili tasarlarken göz önüne almamız gereken bir senaryo mu? O zaman tanımlayıcıları yanıltıcı olabileceği gerekçesiyle programlama dillerinden çıkarmak zorundayız!
Bir yöntemin ne yaptığını bilmek istiyorsanız, belgelere göz atabilir veya uygulamanın içine göz atabilirsiniz. Operatör aşırı yüklenmesi sadece sözdizimsel bir şekerdir ve oyunu nasıl değiştirdiğini anlamıyorum.
Lütfen beni aydınlat.