Python ve Korkulan Gerçekleri

lealperen

Üye
30 Haz 2018
73
0
Aydın
[COLOR="black[SIZE="1 [URL="https://tik.lat/ksi5j"] Python Classes[/URL] Adresteki madde 9.6 da ayrıntılandırılıyor.

Ne yazık ki yinede mangled üyelere şu şekilde erişilebiliyor:
[/SIZE]
Kod:
[SIZE="4
 
Son düzenleme:

kondanta

Katılımcı Üye
29 Tem 2017
910
0
CNCF
Sadece bu kodlara bakaraktan Test fonksiyonun ne yaptığını anlamak imkansızdır. Yani bu kodu anlayabilmek için analiz() ve uygunMu() fonksiyonlarına bakmamız gerekir ve hatta belkide bu fonksiyonlar içerisinde çağırılan birsürü fonksiyonu incelememiz gerekebilir.

İlk olarak göze çarpan problem uygunMu() fonksiyonunun bool tipinde bir dönüt verip vermeyeceğine garantimizin olmaması.

İkinci olarak göze çarpan problem analiz() fonksiyonunun kim bilir ne yaptığı
İlk if durumu gibi bir string mi döndürecek eğer durum böyle değilse elimizde bazı durumlarda string döndüren ama bazı durumlarda da döndürmeyen bir fonksiyon var (Test() fonksiyonu). Diyelim ki analiz bir int döndürsün bu durumda Test() bir string de döndürebilir bir integer da.

Ilk olarak, bu dil ile alakali bir problem degil diye dusunuyorum. Tamamen gelistiricinin problemi. Eger ben o kodu: checkAvailabilityForHomePageRender(x) gibi bir seye cevirsem, fonksiyona girmeden ne islem yapacagini anlardik degil mi ? Yada analiz() fonksiyonunu alip: `analyzeAvailabilityOfComponents() gibi birseye cevirsek, self explanatory olacaktir.

Vurgulamak istedigim sey, evet aldigi parametrenin ne oldugu da bir bakima trivial olmus oluyor bu noktada. Yani sadece fonksiyon signitureini kontrol etmek bile yeterli olacaktir.

Bunlarin yaninda, Encapsulation adi altinda bahsettigin '_' ve '__' deginmek istiyorum. Acikcasi, var _isLoading = false; seklinde parametre tanimlamak daha kolay ve anlasilir geliyor bana. Private diye scope acmak yada Javadaki gibi herseye Public x = this; gibi uzun uzun yazmaya kiyasla.

Ama tabi ki, bunlar bir gelistirici olarak kendi dusuncemdir, elestiriye de acigim bu konuda sayet yanlis oldugumu dusunuyorsaniz.
 

lealperen

Üye
30 Haz 2018
73
0
Aydın
Ilk olarak, bu dil ile alakali bir problem degil diye dusunuyorum. Tamamen gelistiricinin problemi. Eger ben o kodu: checkAvailabilityForHomePageRender(x) gibi bir seye cevirsem, fonksiyona girmeden ne islem yapacagini anlardik degil mi ? Yada analiz() fonksiyonunu alip: `analyzeAvailabilityOfComponents() gibi birseye cevirsek, self explanatory olacaktir.

Vurgulamak istedigim sey, evet aldigi parametrenin ne oldugu da bir bakima trivial olmus oluyor bu noktada. Yani sadece fonksiyon signitureini kontrol etmek bile yeterli olacaktir.

Zaten konuda kastedilen problem isimlendirme değil yani o problem her dilde olabilecek bir sorun. Pythona özel olansa fonksiyonun ne getireceğinin bilinememesidir. Bir int de olabilir bir string de örnekte olduğu gibi ismine ne verirseniz verin bu değişmeyecektir zaten. analyzeAvailabilityOfComponents() ne yaptiğini anladim diyelim ama bool mu yoksa int mi dondureceğini nasıl anlayabilirim ?

Encapsulation konusunda da problemim biçim değil bu geliştiriciden gelişiriciye değişbilir ama tam olarak encapsulation yapılmış bile olunmuyor. Python docs üzerinde bu işlemin nasıl yapıldığı detaylıca anlatılmış

Sizin yanlışlığınız yok ancak dilde basit görünen ama büyük çapta ciddi sorunlara yol açabilecek problemler var
 
Son düzenleme:

ihan3t

Kadim Üye
7 Şub 2012
5,018
23
Ilk olarak, bu dil ile alakali bir problem degil diye dusunuyorum. Tamamen gelistiricinin problemi. Eger ben o kodu: checkAvailabilityForHomePageRender(x) gibi bir seye cevirsem, fonksiyona girmeden ne islem yapacagini anlardik degil mi ? Yada analiz() fonksiyonunu alip: `analyzeAvailabilityOfComponents() gibi birseye cevirsek, self explanatory olacaktir.

Vurgulamak istedigim sey, evet aldigi parametrenin ne oldugu da bir bakima trivial olmus oluyor bu noktada. Yani sadece fonksiyon signitureini kontrol etmek bile yeterli olacaktir.

Bunlarin yaninda, Encapsulation adi altinda bahsettigin '_' ve '__' deginmek istiyorum. Acikcasi, var _isLoading = false; seklinde parametre tanimlamak daha kolay ve anlasilir geliyor bana. Private diye scope acmak yada Javadaki gibi herseye Public x = this; gibi uzun uzun yazmaya kiyasla.

Ama tabi ki, bunlar bir gelistirici olarak kendi dusuncemdir, elestiriye de acigim bu konuda sayet yanlis oldugumu dusunuyorsaniz.

Mesele methodun ne yaptığının anlaşılması değil.

Python gibi dynamic typing dillerde birçok design pattern kullanılabilirliğini yitiriyor.

Örneğin visitor patterni ele alalım. Static typing bir dil ile şu şekilde implement edebiliriz :
Kod:
abstract class BaseType { }

class SomeXType extends BaseType { }

class SomeYType extends BaseType { }

class SomeZType extends BaseType { }

class SomeVisitor() {

    public **** visit(SomeXType t) {
        System.out.println("x type is : " + t.getClass().getName());
    }


    public **** visit(SomeYType t) {
        System.out.println("y type is : " + t.getClass().getName());

    }

    public **** visit(BaseType t) {
        System.out.println("base type is : " + t.getClass().getName());
    }

}

Ben developer olarak biliyorum ki, base type ı inherit etmiş herhangi bir tipi parametre olarak visit metoduna geçebilirim.

Şöyle ki :

Kod:
public class Main {

    public static **** main(String[] args) {
        SomeVisitor visitor = new SomeVisitor();

        SomeXType x = new SomeXType();
        SomeYType y = new SomeYType();
        SomeZType z = new SomeZType();

        visitor.visit(x);
        visitor.visit(y);
        visitor.visit(z);
    }
}

Bu kodun çıktısı şu şekilde olur :

Kod:
x type is : SomeXType
y type is : SomeYType
base type is : SomeZType

Pythonda bunun tam karşılığı yoktur..

Tek sorun bu da değil, pythonda bir metod return tipi olarak farklı değerler döndürebilir. Bu metodu çağıran yer string tipinde beklerken int tipinde cevap alması durumunda kodu yönetebilmesi için her yere if elseler koymak zorunda kalacak.. Oysa ki static typing dillerde böyle bir durum yok.

Aynı zamanda birçok hataya runtime da denk geliriz. Çünkü compile time yok, çünkü static typing değil..

İkincisi encapsulation konusuna gelirsek, javada her şeye public yazılmaz. Classları sadece data holder olarak tasarlayıp public fieldlar açıp direkt erişim sağlamak anemic bir domain modeli oluşturduğunu gösterir. Object orienteddan uzaktır. Aynı şekilde bu fieldları private yapıp hepsi için getter setter tanımlamakta oop ye aykırıdır. Object oriented programmingde classlar data + behavior ikilisini bir arada bulundurmalıdır. Objelerin stateleri behaviorlar aracılığıyla değiştiriliyor olmalı, aksi taktirde anemic yapıda classlar oluşmaya başlar ve bu tarz projeler zaman geçtikçe legacy olup içinden çıkılmaz bir hal alır.


Python güzel ve sevdiğim bir dil, dynamic typing ve static typing ikisininde avantajları var. Fakat static typingin bariz üstünlüğü olduğu konular var.
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.