Farklı programlama dillerinde OOP öğrenmenin bir farkı var mı? [kapalı]


9

OOP öğrenmek istiyorum. Python'u biliyorum ve OOP hakkında çok az şey biliyorum.

Ama forumlarda "OOP öğrenmek" aradığımda "Python o kadar yeni ki Python'da OOP öğrenemezsiniz. Java öğrenmeli sonra Java'da OOP anlamalısınız" diyen bir adam gördüm

Bu doğru mu? Farklı programlama dillerinde OOP'yi anlamakta herhangi bir fark var mı? Java, C #, C ++, Perl veya Python'da öğrenmek ister misiniz?


12
"Python çok yeni, bu yüzden Pyton'da OOP öğrenemiyorsun. Java öğreniyorsun, sonra Java'da OOP'yi anlıyorsun . Python kullanarak OOP öğrenmek istiyorsanız, neden olmasın diye bir neden göremiyorum. Göreyim seni!
Hayal kırıklığına

13
Python Java'dan daha eski değil mi? Kafamın üstünden olduğuna inanıyorum ama birkaç yıl kapalı olabilirim.
Jimmy Hoffa

2
@JimmyHoffa Gerçekten de öyle. Wikipedia'ya göre 91'e 95 çıktı.
Evicatos

2
@JimmyHoffa: hadi, bu doğru olamaz, değil mi! Hepimiz Java'nın ilk OO dili olduğunu biliyoruz. "Sun Java'nın yeniliklerini yüksek sesle müjdeliyor" ... - Soruya gelince ... neden OO öğrenmeye kararlısınız? Yakında size zorlanacak. Python, çoklu programlama paradigmalarının faydalarına dair fikir edinmek için mükemmel bir başlangıç ​​noktasıdır.
leftaroundabout

Yanıtlar:


10

Teorik bir yapı olarak bir nesne çok basittir: Verileri, işlevleri veya her ikisini birden saklayan bir yapıdır. Bu yapıların Python dışındaki birçok dilde örtük olan bir “benlik” duygusu olduğu fikri. Buna "tanımlayıcı" denir ve nesneye verileri (değişkenler veya alanlar) ve işlevleri (genellikle yöntemler olarak adlandırılır) söz konusu nesneye bağlayan bir öz referans noktası verir. Fikir, daha büyük, daha genel bir yapıdan ziyade, belirli bir örneğe (tipik olarak altındaki bellek bloğu) ait olan bir değişken veya yöntem kullanmanızdır.

Nesne sistemleri iki büyük kategoriye göre farklılık gösterir: Kalıtım ve Erişim.

Java veya C ++ gibi bazıları, daha sonra tahsis edilen nesneler için "taslak" görevi gören sınıflar beyan ettiniz. Bu sınıflar ve nesneleri, somutlaştırıldıktan sonra yapısal olarak değiştirilemez. Değişkenlerin değişebileceği anlamında içerikleri geçersiz kılınabilir, ancak yapıları statiktir. Örneğin, Java'daki HashMap'e yeni yöntemler ekleyemezsiniz. Arabirimi genişletebilir (temel olarak sözleşmeler olarak uygulanan sınıflar) veya söz konusu belirli sınıfın tüm orijinal değişkenleri ve yöntemleriyle birlikte ihtiyacınız olan ekstra yöntemleri veya değişkenleri almak için bir alt sınıf yapabilirsiniz.

En tipik olarak Ruby olan diğer sınıf tabanlı diller, mevcut bir sınıfı kolayca açmanıza ve uygun gördüğünüz gibi yöntemler eklemenize olanak tanır. Bu bir çekişme kemiğidir ve birçok kişi tarafından çok, çok tehlikeli olarak kabul edilir.

Javascript daha gevşek, Nesneler ya değişkenler ya da fonksiyonlar için bir yuvalar topluluğundan başka bir şey değildir. Programcı buna ihtiyaç duyduğunda, değiştirilebilir veya üzerine yazılabilirler. Hatta diğer nesneler için keyfi olarak "Prototipler" olarak klonlanabilirler, böylece tüm yeteneklerini aktarabilirler.

Erişim kontrolü, çeşitli diller arasındaki diğer büyük fark noktasıdır.

Java gibi bazı diller, belirli bir değişken veya yöntemi tam olarak hangi sınıfların ve alt sınıfların kullanabileceğini tanımlayan "özel" ve "korumalı" gibi çok sıkı bir şekilde zorlanmış erişim değiştiricilerine sahiptir.

Python gibi diğerleri, özel olduğunu belirtmek için yöntemden veya değişken adından önce bir alt çizgi kullanarak daha az resmidir.

Nihayetinde, Python nesne yönelimli bir şekilde programlamak için mükemmel bir meşru dildir, sadece diğerleri kadar titizlikle uygular.


Olabilir bu soru için biraz fazla teknik.
Zeroth

@zeroth ve çok spesifik. 'Self' (veya 'this') parametresi evrensel olmaktan uzaktır.
Javier

@Javier Bu yüzden Python'da açık ve başka yerlerde örtük olduğunu söyledim.
Dünya Mühendisi

Soru OOP öğrenmeyle ilgili ve bence privateJava için sahip olduğumuz Kapsülleme ve __Python için alt çizgi ( ) gibi belirli kavramları gerçekleştirmek için bir dilin nasıl yazıldığını tartışmak oldukça önemli. Bence Python'un soyutlama seviyesi onu yeni başlayanlar için biraz daha zorlu hale getirebilir, ama kesinlikle imkansız olmayabilir. Java, programcı için bazı kavramların biraz daha kolay yapışmasını sağlayabilir.
Derek W

@WorldEngineer açık / örtük olmaktan bahsetmiyorum (ayrıca, Python bu konuda olağandışı değil), ama sadece bir kavram olarak var. Bazı diller sadece ilkinde değil tüm parametrelerde polimorfik sevkiyat yapar. Bazıları belirli sürüm için başka ipuçları kullanır ve ana stil bir argümanı 'this' olarak ayrıcalıklı kılmayabilir.
Javier

18

OOP prensiplerini öğrenmek hiç de dile özgü değildir, bu yüzden eğer "OOP öğren" derken "terminolojinin ne anlama geldiğini, OOP'nin ne olduğunu ve neden kullanmak isteyebileceğimi" öğrenirseniz, o zaman dilin önemi yoktur.

"OOP kullanarak nasıl geliştireceğinizi öğrenin" demek istiyorsanız, evet, farklı diller farklı şekilde ele alır, ancak hepsi aynı ilkeleri paylaşır. Eğer benim gibi bir şeysen bunu en iyi öğrenerek yaparsın. Nesneye yönelik yönleri kapsayan ve ona sahip iyi bir öğretici veya kitaba sahip nesne yönelimli bir dil seçin. Nesneye yönelik tasarım ilkeleri varsa, bunları başka bir OO dilinde kullanabilirsiniz.

"Python o kadar yeni ki, bu yüzden Pyton'da OOP öğrenemezsiniz. Java öğrenir, sonra Java'da OOP anlaşılır"

Bu sadece kafamı incitiyor. Çok fazla yanlış bir cümleye sıkıştı.

Python 1989 yılına dayanıyor.

http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html

1995'ten Java'ya.

http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html

Bu tavsiyenin geçerliliği hakkında kendi kararlarınızı verebilirsiniz ...


1
Evet ama Python 1.0 1994'e kadar değildi. Java da piyasaya sürülmeden önce bir süredir geliştiriliyordu. Ama Python'un OO'su olduğunu kabul ediyorum ve OO kavramlarını öğrenebilirsiniz. Aksini söylemek saçma.
chubbsondubs

2
@chubbsondubs Evet, bu hala Java'dan önce! ;)
Izkata

1
Sadece hafif bir kontrpuan noktası sağlamak için sınıf tabanlı OOP (C ++, Java, Python ve diğerleri) prototip tabanlı OOP'tan oldukça farklıdır (JavaScript bunu kullanan tek dildir). Hala OOP ve aynı temellere sahipler ve aynı amaçların çoğuna hizmet ediyorlar, ancak birçok insan sınıfları OOP olarak düşündüklerinin bir parçası olarak görüyor, ancak JavaScript bunlara sahip değil ve kesinlikle nesne yönelimli.
KRyan

@KRyan: İlgilenmeniz durumunda, Self adında başka bir prototip tabanlı OO dili var.
Jerry Coffin

ActionScript'in hem prototipleri hem de sınıfları vardır.
OrangeDog

8

Sanırım alıntı yaptığınız kişi sadece dil şovenizmi sergiliyordu.

Gerçekte, OOP kavramları ile OOP'nin uygulanması arasında bir fark vardır . Şiirsel olarak, bu en iyi OOP kavramlarından bazılarını daha iyi kavradığınızda anlaşılır.

Birçok programcı sadece birkaç benzer dilde rahatlık gösterir, bu nedenle yeteneklerini genişletmek zorunda kalmazlar veya bir süre yeteri kadar acı çekmezler.

Yani soru aslında Python size OOP kavramlarını öğretecek mi ?

Öz yönelimli öğrenmede normalde keşfetmeyeceğiniz şeyleri denemenizi sağlayacak yeterli öğrenme desteğiniz varsa, yapabileceğinizi söyleyeceğim. Bir kitap veya bir tür akıl hocası en iyisi olur. Mark Lutz, Python hakkında çok derinlemesine, çok detaylı ve çok mükemmel kitaplar yazıyor ve kitaplarını tavsiye ederim çünkü sizi daha fazla şey yapmaya ve öğrenmeye zorlayacaklar.

Hatırlamanız gereken şey, Python'un yolunun Tek Yol değil, Tek Doğru Yol olmadığıdır. Ne kadar çok programlama paradigması olursa o kadar iyi bir programcı olursunuz. Python'un OOP yapma şekli, C ++ veya Java'nın yaptığı gibi değildir, ancak kavramlar iyi aktarılır.


4
OOP açısından, Java ve C ++, Python'dan farklı olduğu kadar birbirinden farklıdır.
Robot Gort

Bir dereceye kadar, bunun nedeni büyük ölçüde dil tasarımı bilgisinin ve farklı kısıtlamaların değişmesidir.
Zeroth

Ve açıkçası, OOP kavramlarının% 90'ı aralarında iyi görünmez, neredeyse görünmez bir şekilde.
Zeroth

Evet, katılıyorum. Java ve C ++ OOP açısından "aynı" olduğunu düşünmek biraz komik buluyorum.
Robot Gort

4

Evet, OOP uygulamaları çok farklı. Teori ve ilkeler aynı olsa da, pek çok insan Java ve C ++ 'ın yaptığı şeyleri "gerçek OOP" olarak düşünür, "dil agnostik" olması gereken birçok referans alırsınız, ancak aslında sınıf tabanlı, statik olarak yazılmış diller olduğunu varsayarız .

Bu, referansların kötü, hatta sınırlı olduğu anlamına gelmez; örneğin "dörtlü çete" (GoF) seminal kitabı "Tasarım Desenleri: Yeniden Kullanılabilir Nesneye Yönelik Yazılım Öğeleri", gerçekten "statik sınıf tabanlı OOP" anlamına geldiğinde "OOP" yazan harika bir çalışmanın en iyi örneğidir.

Bence: Evet, Python, Javascript, C ve diğer birçok dilde çok fazla OOP öğrenebilirsiniz; ancak "OOP deneyimi" istendiğinde bazı insanlar (belki de gelecekteki bir işveren) Java / C ++ / C # anlamına gelir. Bu yüzden diğer görüşü de kontrol etmek akıllıca olur.

(ve bunlar sadece iki tip OOP değil ....)


2
İronik olarak statik, sınıf tabanlı OOP, Alan Key'in başlangıçta OOP olarak önerdiği şey değildir. Ancak bir çok "öğrenme"
OOP'si

2
CLOS'a bakmak da mantıklı olabilir: Birçok dilin / çerçevenin multimethod sunduğunu düşünmüyorum.
Giorgio

2
@jozefg: Doğru, Alan Kay bir keresinde "Aslında" nesne yönelimli "terimini oluşturdum ve size aklımda C ++ bulunmadığını söyleyebilirim."
Javier

1
@Giorgio Aslında Dylan (belirtmek için bir yol biraz daha basit CLOS sürümünü sağlayabilir zaman yaklaşıma bir multimethod çalıştırılır, ancak çok daha basit)
Daniel Gratzer

4

Nesneye Yönelik Programlama, düşük kuplajı, bilgi gizlemeyi (kapsülleme olarak da bilinir), bu veriler üzerinde birlikte çalışan verileri ve yöntemleri bir araya getirmek ve kodun yeniden kullanımını teşvik etmek için programlama dilinin nasıl yapılandırılacağı hakkında bir fikirdir. Birçok dil bu fikirleri ele alır, böylece nesneler arasında Nesne Yönelimi'ne nasıl yaklaştıklarına dair farklılıklar vardır. Örneğin, Java yalnızca bir sınıfın 1 sınıfı genişletmesine izin verir. Ancak, Python ve C ++ istediğiniz sayıda sınıfı genişletmenize izin verir. Java'nın sınırlamaları için belirli nedenleri vardır. C ++ 'dan bir şeyleri düzeltmek için yapılan sınırlamalar, aynı zamanda Smalltalk sadece tek bir temel sınıfı desteklediğinden.

OO dilleri iki ailede gruplandırılabilir. Smalltalk ailesi (veya sınıf tabanlı OOP), C ++, Java, Smalltalk, Ruby, C #, Python'u birkaç isim olarak içerir (bu ailede ton vardır). Bunlar, statik ve dinamik olarak yazılan dillerin bir karışımıdır ve bazı kavramlarda biraz farklı olsalar da, OOP hakkında nasıl düşündüklerine çok benzerler. Demek istediğim, birleştirme, kapsülleme, bağlama verileri ve yöntemleri ve kodun yeniden kullanımı ve bunu yapmaları için sağladıkları araçlar. Bu aile içinde pek çok kavram aynıdır.

Diğer aile ise prototip tabanlı OOP'tur. Bu diller, OOP uygulamalarında çok farklı görünmektedir. Muhtemelen bunun en iyi bilinen örneği Javascript'tir, ancak Javascript bu fikirleri Şema ve Nesne LISP'den kopyalamıştır. Bunlar daha az bilinen dillerdir ve genellikle dinamik olarak yazılır. Statik olarak yazılmış prototip tabanlı bir dil düşünemiyorum, ama bu bir tane olmadığı anlamına gelmiyor. Burada okuyabilirsiniz: http://en.wikipedia.org/wiki/Prototype-based_programming . Mesele şu ki, OOP'ye sınıf temelli dillerden çok farklı bir şekilde yaklaşıyorlar. Bu, kavramların bu iki aile arasında taşınabilir olmadığı anlamına gelir. Bir ailede OO olduğunu bildiğiniz için bu fikirleri diğer aileye kolayca geçireceğiniz anlamına gelmez.

Çoğu programlama dilinin kavramları birçok fikirden birleştirdiğini unutmayın. Python ve Ruby, OOP ve fonksiyonel programlama fikirlerini kendi dillerine dahil eder. Ve prototip tabanlı OO'yu sınıf tabanlı dillerdeki bazı uzantılarla karıştırabilirsiniz, böylece daha da karmaşık hale gelir.


Smalltalk ailesine C ++ saymazdım. Smalltalk, Simula'ya dayanıyor ve Alan Kay , Simula-II'deki değişikliklerin çoğunu kasıtlı olarak göz ardı ederken, C ++ buna dayanıyor. C # garip, C ++ kullanıcıları ve Pascal tasarımcıları tarafından Java gibi tasarlandı.
Jörg W Mittag

1

OOP programlama prensibidir - temelde bir fikirdir. OOP'nin uygulanması programlama dilleri arasında değişmektedir - ancak OOP'un sütunları (Soyutlama, Kalıtım, Kapsülleme ve Polimorfizm) genellikle bir şekilde veya biçimde mevcuttur.

Her iki dili tercih etmeden söyleyeceğim, Java semantikleri programcıya Python'dan biraz daha zorlar.

Örneğin,

Java kodu: class Cat extends Animal {}

OOP bakış açısıyla neler yaptığınız konusunda biraz daha açık:

Python kodu: class Cat(Animal):

Elbette ikisi de Cat'in Animal'den miras aldığı bir sınıf hiyerarşisi tanımlar. Ancak, OOP'da yeni başlayan bir programcı için, OOP fikirlerinin uygulama ve sonuçlarının Java'da programcıya hecelediği için biraz daha iyi olabileceğini hissediyorum.


1

OOP kavramlarını öğrenmek için en kolay dilin ne olduğunu açıkça soruyorsunuz. Bence cevap açık: python .

Bunun neden böyle olduğunu göstermek için, Java ve Python'daki tipik başlangıç ​​programına bakalım. Basit bir yüksek-düşük tahmin oyunu yapalım.

Java

Java'da bir Game sınıfı yazacaksınız.

public class Game {
    public int secretNumber;
    public int tries;

    public Game(int tries, int secretNumber) {
        this.tries = tries;
        this.secretNumber = secretNumber;
    }

    public void guess(int myNumber) {
        if(myNumber > secretNumber)
            System.out.println("Your guess is too high!");
        else if (myNumber < secretNumber)
            System.out.println("Your guess is too low!");
        else
            System.out.println("You win!!");
        tries = tries - 1;
        if(tries == 0) {
            System.out.println("No more tries: you lose :(");
        }
    }

    public static void main(String[] args) {
        Game game = new Game(10, 47);
        while(true) {
            // how do I read a newline again? Something with BufferedInputStreamReader?
            // how do I convert a String to a number?
        }
    }
}

Deneyimli bir programcıyım ve hatta zorlanıyorum. Ayrıca, bu basit program için aday bir öğrenciye açıklamanız gerekenlere bakın:

  • Statik yöntemler
  • Görünürlük (herkese karşı özel). Alanları her zaman özel olarak işaretlemelisiniz.
  • this. başkaları tarafından maskelentiklerinde değişkenlere başvurma gösterimi
  • Yapıcı bir yönteme benzer, ancak bir yöntem değildir.
  • System.outbir outputStream. Ve evet, bu bir alan, ama bir staticalan.
  • Bazen, yalnızca bir ifade varsa kıvırcık parantezleri atlayabilirsiniz
  • String[]bir dizidir. Özel bir nesne türüdür, ama yine de, gerçekten değil.
  • intilkel bir tiptir. Özeldir.
  • Birçok çerçeve yöntemine ihtiyacınız var

piton

Python çok daha 'saf'. İlkel tip yoktur. Bir kurucu mevcut değil, sadece başlangıçta çağrılan özel bir yöntem var.

Konsolla etkileşime girmenize gerek yoktur, çünkü a REPL. g.guess(35)Bir dizeyi kullanarak ve döndürerek oyunu oynayabilirsiniz .

Bu, dilin öğrenilmesini ve temel OOP kavramlarını kavramasını kolaylaştırır.


0

OOP'taki ana fikir, değişkenleri ve yöntemleri sınıflar içinde (python kesinlikle destekliyor) birlikte kapsüllemek (bu da paketlemek veya gizlemek anlamına gelir). Kodunuzu Isimler etrafında tasarlamakla ilgilidir. Sonra oradan devam ediyor.

Uygulama farklılıkları (örneğin, python, Java'nın yaptığı gibi görünürlüğü desteklemez) ve sözdizimi farklılıkları (Javascript'te yöntemleri kendiniz miras almanız gerekir) olsa da, temel tasarım aynı kalır.

Yine de, Java gibi bir dilde OOP öğrenmenin daha kolay olduğunu düşünüyorum, çünkü dil gerektiriyor ve topluluk, python topluluğundan daha az olumsuz.

Ama orada OOP tasarımı ve uygulamaları hakkında tonlarca yazı var ve bunu okumak çaba harcanmıyor. Python yazarken bile (ki bu çok fazla), çok fazla nesne yazıyorum ve üçüncü taraf kütüphanelerinden çok fazla nesne kullanıyorum.


Kod fikri mesaj iletmektir. Ayrıca kaynak yok.
Kullanıcı

1
OOP sınıflarla ilgili değil .
Jörg W Mittag

1
Kullanıcı Alan Kay'ın orijinal fikri mesajlaşma ile ilgiliydi, ancak o zamandan beri OO uygulaması isim veya nesne sınıfları tarafından tasarıma dönüştü. Örneğin, Dr. Kay ayrıca Java'nın Nesneye Yönelik olmadığını, çünkü geç bağlanmayı desteklemediğini düşünmüştür. @ Jorg lol ya ya
Rob

0

OOP'yi bir dilde öğrendiğinizde bu dilde düşünmeye başlarsınız. Dil, yapılabileceğini düşündüğünüzü ve OOP'a nasıl ve nasıl bir lezzet kattığını etkiler.

  • Çöp Toplama olmalı mı?
  • Tamsayılara yöntem ekleyebilir miyim?
  • Sınıf veya prototip kullanıyor muyum?
  • Nesneler kendilerini nasıl yansıtır?

Bazı insanlar sınıfsız OOP yapamazlar. Bazıları nesnelerini süreçle öldürmelidir.

OOP'un bir çekirdeği ve bununla ilgili orijinal fikirler var. Ayrıca Smalltalk, Self, Simula, LISP, Newspeak'e de göz atabilirsiniz. Ayrıca veri akışı dilleri bash, APL, J. gibi OOP olmayan dil türlerine de bakın. Mantıksal olanlar Prolog. Haskell (tip sınıfları). Hepsi size farklı bir düşünce öğretecek ve bunu öğrenebilirsiniz

  • OOP zorunlu dillerle ilgili değil
  • OOP sınıflarla ilgili değil

Ve sonunda OOP'un ne için iyi olduğunu görebilirsiniz. En azından bunun hakkında başka bir fikrin olacak. Alan Kay'ın görüşmelerini bulmanızı öneririm .


Eğer dillere bakmazsanız bu yazı işe yaramaz.

Burada görebileceğiniz gibi: OOP'un ne olduğu konusunda anlaşamıyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.