Python'da OOP kullanımın temel mantığı üzerine

Merhaba. İnternet üzerinden OOP dersleri izliyorum. Classları, instanceları ve bunların methodlarını anladım sayılır. Aşağıda kendimce şöyle bir kod çalıştım:

class Personel:
    def __init__(self,name,age,job):
        self.name = name
        self.age = age
        self.job = job
        

    @staticmethod
    def user_add():
        print("Personel Ekleme Sayfası")
        get_name = input("İsim: ")
        get_age = input("Yaş: ")
        get_job = input("İş: ")

        return Personel(get_name,get_age,get_job)

p1 = Personel.user_add()

print(p1.name)

Birincisi, bu tür bir kullanım doğru mudur?

İkincisi, bir arkadaş, bu şekilde çalışmanın doğru olmadığını, Personel için ayrı bir class, personeli inputlar ile eklemek için ayrı bir class tanımlamam gerektiğini falan söyledi. Ama ben de mantık olarak, “Personel” isimli classın altında personellere dair her türlü işlemi yapmam gerektiğini düşündüğüm için bu şekilde çalışmıştım.

Üçüncüsü, Nesne Tabanlı Programlama mantığı üzerinden kod yazdığımız zaman, her şey classlar içinde mi yapılmalıdır? Yani diyelim ki bu şekilde bir personel classı tanımladık. Bu classn dışında ben ifler-elseler veya farklı fonksiyonlar ile çalışsam, yanlış mı yapmış olurum?
Veyahut yaptığım her işlemi de farklı alanlarda classlar içinde mi yazmam daha doğru olur?

Örneğin, stok işlemlerini yapabilmek için stok classı, muhasebe işlemleri için muhasebe classı, bunların kendi içindeki işlemler için de alt classlar gibi mi olmalı? Yani tek bir class içinde o sınıfa ait bütün işlemler, fonksiyonlar ve değişkenler ile mi çalışmak daha doğru? Yoksa, açılan classlardan bağımsız bir şekilde fonksiyonlar, değişkenler ile müdahele mi edilmeli?

Biraz uzun oldu. İzah etmekte yetersiz kaldıysam affola. Zaman ayırıp cevap verebilecek arkadaşlara şimdiden çok teşekkür ediyorum. İyi günler dilerim.

Bu kullanım yanlış değildir. Ancak doğru da değildir. Arkadaşınızın söylediği yöntem daha doğrudur. Belli tasarım kalıpları var. Bu kalıplar kodu yazarken ve okurken daha temiz olmasını sağlıyor.

Üçüncü soru için net bir cevap veremeyeceğim. Ben kendim yazdığım zaman tek sınıf kullanmayı seviyorum. Ancak şimdiye kadar kullandığım kütüphanelerde farklı durumları da gördüm. Mesela tkinter'de genelde birden çok sınıf oluşturmuşlar. tkinter bir GUI kütüphanesi ve farklı araçlar için farklı sınıflar mantıklı bir tercih. Tam aksine Vue.js tek sınıfla çalışıyor. İçinde farklı bölümler olduğu halde tek örnek içinde tanımlanıyor. Bazı standart kütüphane modülleri ise hiç sınıf kullanmıyor. Karma kullanımla ilgili bir örnek bulamadım. Ama illaki vardır.

Benim tavsiyem tasarım kalıplarını araştırın ve o arkadaşınıza güvenin.

1 Beğeni

Cevabınız için çok teşekkür ediyorum hocam. Benim için bir miktar daha anlaşılabilir oldu sayenizde :slight_smile:

Calisiyorsa dogrudur tabi ama sanirim seyi soruyorsun: ben sevmedim.

Asagidakiler de kendi fikrim.

Personeli inputlar ile eklemek tek bir fonksiyon, sinifi hak etmiyor.

Personelle ilgili her seyin toplanmasi gereken yer modul. Bu modulu bir namespace (Java), modul (Python) veya sinif (hepsi) olarak tasarlayabilirsin.

Java’da, C#'ta mecburen. Kimisine sorarsan evet. Dogru cevabi kodu beraber yazdigin topluluk verir. Bana sorarsan en OOP kodda bile sinif icine girmeyi hak etmeyen seyler var. Ama cogunluk sinif icindeyse onlari da koyuver.

Bunlar class’tan ziyade modul. Class’in en onemli gorevi state soyutlamak/degisken paylasmak. Bu forumda bu konuda yazdigim seyler var, bi bakar misin, aranabiliyor mu?

Butuncul konusmayi denemek yerine yukarida gordugumu soyleyeyim, belki daha iyi ifade eder:

user_add’in her seyden once ismi yanlis. “User” diye bir sey yok, olsa da bir yere eklemiyor. Dogru ismi “stdin’den girilen bilgilerle Personel instance’i yarat”. Kisaltmasi sana kalmis.

Sinifta olmasina gerek yok. Olmasinda sakinca yok. Fakat instance yaratan bu tur fonksiyonlar icin classmethod daha uygun.

Devami diger post’ta kaldi, birlestirmeye de usendim. Degisik sekillerde yazip review isteyebilirsin.

1 Beğeni

Hocam bunca açıklamadan sonra diyebilirim ki çok yanlış hareket etmişim :slight_smile: İnşallah ufak çaplı, daha çok fonksiyonlardan müteşekkil basit projeler ile alıştırmalar yapacağım. Belki ilerleyen zamanlarda OOP ile kodlama yapmaya girişebilirim.

Çok teşekkürler açıklamalarınız için.