Fiziksel gerçek dünya nesnelerine başvurmadan OO'yu nasıl öğretebiliriz? [kapalı]


14

Bir yerde, OO'nun arkasındaki orijinal kavramların, birden çok sistem arasındaki veri mesajlarını bu verilerin durumunu koruyacak şekilde işlemek için daha iyi bir mimari bulmak olduğunu okuduğumu hatırlıyorum. Şimdi bu muhtemelen zayıf bir açıklamadır, ancak (Bisiklet, Araba, Kişi vb.) Nesne analojileri olmadan OO öğretmenin bir yolu olup olmadığını merak ettim ve bunun yerine mesajlaşma yönlerine odaklanıyor. Makaleleriniz, bağlantılarınız, kitaplarınız vb. Varsa, bu yardımcı olacaktır.


6
OO'nun kökeninin, gerçek dünyadaki nesnelere çok fazla dayanan simülasyonlar için tasarlanmış bir dilde olduğuna inanıyorum . Bu, OO'nun gerçek olmayan nesneler için yararlı olmadığı anlamına gelmez, ancak mutlaka aydınlatma tarihine bakamazsınız.
Tom Anderson

7
Öğretirken neden tanıdık, anlaşılır, gerçek dünyadaki nesnelerden kaçınmak istesin?
Adam Crossland

1
Yine de ilginç bir soru. OO'nun fiziksel değil köklü olup olmadığı ve OO'yu fiziksel dünya açısından öğretmenin iyi bir fikir olup olmadığı, fiziksel dünyaya atıfta bulunmadan öğretmenin verimli bir yolunu bilmek gelişecektir.
Tom Anderson

3
Açıkçası, GUI ve web uygulamaları (yani veri modelleri ve görünümler için) için nesnelerin kullanılmasına ilişkin birkaç örnek daha görmek istiyorum, çünkü bunlar, etin ve patateslerin gelişimidir. "Gerçek dünya" nesneleri kabuk - yararlı, ama her zaman iyi bir yemek için gerekli
HorusKol

1
@HorusKol: Tam tersine sahipsin. Temel alan modeli yemektir. Bu neredeyse her zaman gerçek dünya nesnelerine odaklanır. Aksi halde, neden yazılım yazmalıyım? GUI veya web sunumu sadece servis tabağıdır. İlginçtir ki, sunum çok çaba gerektirir. Belki de bu, araçların ilkelliği hakkında bir şeyler söylüyor.
S.Lott

Yanıtlar:


4

Orijinal OO kavramının bugünün OO'su ile bir ilgisi yoktur. (Bkz. Peki * Alan Kay "nesne yönelimli" terimiyle gerçekten ne demekti? ). Günümüzün nesne yönelimli programlaması, bisikletlerin, evlerin ve insanların metaforları vb. Korelasyonu görmelerine yardımcı olun ve sonra OO hakkında daha derin şeylere daldıklarındaki farkları görmelerine yardımcı olun.

EDIT: Bugünün OO özellikleri ve yetenekleri tamamen / kısmen çeşitli yöntemler (işlevler) ve öznitelikleri (referanslar AKA değişkenleri ve sabitler) kullanılarak açıklanan tamamen bağımsız nesneler oluşturmak ile ilgilidir.


4

Bağlanma ve uyum kavramları hakkında konuşabilirsiniz. Nesneler, yüksek kohezyon ve dolaylı olarak yüksek bağlanma özelliklerine ve yöntemlerine sahip olmalıdır. Sistemin çalışması için gereken en küçük işlemlerle ve özniteliklerle eşleşmelidirler. Ayrıca, kodu mümkün olduğunca küçük ve açık tutma arzusunu da yerine getirmelidirler, yani bakım ve genişletilebilirlik göz önünde bulundurularak kodlama.

Bu aynı zamanda yaygın nesneler olan "nesne patlaması", aşırı genelleme ve yanlış metafor seçimini de önler.


1
+1, aslında benzetmeyi cevaplamak yerine soruya cevap vermek için gereklidir!
Steven Jeuris

1
Ben de bunun OO'nun özü olduğunu görüyorum. Bu, OO'yu nasıl göründüğü yerine faydalarının ne olduğu konusunda açıklar. Listeye yeniden kullanılabilirlik ekleyin, bu cevabı tekrar kaldırmak istiyorum. ; p
Steven Jeuris

2

Gerçek dünyadaki nesnelere ve mesajlaşmaya da odaklanmam. Daha ziyade kullandığım bir örnek, "kendilerini nasıl çizeceğini bilen" nesnelerin olmasını istediğiniz grafiklerde.

Örneğin, OO yerleşik olmayan C'de çalışıyorsanız, işaretçileri veri nesnelerinin içindeki işlevlere depolamayı uygun bulabilirsiniz. Bunu yaparsanız, OOP'a giriyorsunuz.

Alan Kay'a Musa'nın tabletleri teslim ediyormuş gibi bahsetmekten hoşlanmıyorum. Aksine, matematik ve biyoloji eğitimi almış olduğuna inanıyorum. Bir matematikçi olarak, muhtemelen oldukça soyut olan ve donanımla ilgili olmayan Lambda Calculus'a aşinalığa sahipti. LC'de her şeyin bir "nesne" olduğunu söyleyebilirsiniz - 0 sayısı ve 1 sayısı gibi, bir argüman verildiğinde farklı şeyleri değerlendiren nesnelerdir. Bu Smalltalk'a oldukça hoş bir şekilde yol açar. "Mesaj" fikri donanım hakkında konuşmaktan kaçınabilmemizdir. Bir işlevi (veya bir nesnenin yöntemini) çağırdığınızda ona bir mesaj gönderdiğinizi ve geri döndüğünde size (veya devamınıza) bir mesaj gönderdiğini söyleyebilirsiniz. Bu, ayrı bir donanımda eşzamansız olarak çalışan programlar arasında iletişim kurma yollarını açıklamanın bir yolu olarak kilitlendi. Bu iyi, ama sıradan programlama için bu işlem ortadan kalkıyor. OOP fikrinin değerini elde etmek için, yapmaya çalıştığınız somut görevin önemini ya da üzerinde çalıştığınız donanımın somutluğunu reddetmeniz gerekmez. OOP hakkında tartışmalı analojiler açısından öğretmenin, veri tasarımı açısından yazılım tasarımını çok fazla düşünmesine yol açtığını düşünüyorum, aşırı tasarımına yol açıyor, kod patlamasına ve büyük performans sorunlarına yol açıyor. yeterince kötüleşiyor.


Referans verdiğim tartışmayı okursanız Alan Kay'ın OO olarak adlandırdığı şeyin modern OO ile hiçbir ilgisi olmadığına işaret edeceğinizi göreceksiniz ... bu yüzden referans verdim.
Kenneth

@Kenneth: İşte bağlantı. AK'nin söylediğini duymadığım şey, fikirlerinin kimsenin İncil olmasını istediğidir. Tahminine göre gerçekten iyi bir fikirdi. Özellikle Hewitt'in PLANNER'ine (üzerinde iyice aşılandığım) bir gelişme olarak atıfta bulunuyor. Bunlar, akıllı insanların sahip olduğu güzel fikirlerdir, hiçbir şekilde karşılaştırma yapmak için başka şeylerin kusurlu olarak kabul edilmesi gereken kutsal kaseler olarak görülmemelidir.
Mike Dunlavey

@Mike Belki de hala söylediklerimi yanlış anlıyorsunuz ... Özgün fikirlerinin ne olduğunu göstermek için yaptığım tartışmaya başvurdum, bugünün OO'suna çok fazla UYGULAMAZ. Fikirlerine kesinlikle inanmam, hatta onları incelemem.
Kenneth

@Kenneth: İnsanların gerçek OOP hakkında konuştuğunu duyduğumda veya AK'nin gerçekten ne anlama geldiğini duyduğum gibi, "sıcak düğmelerime" sarılıyorum . Afedersiniz.
Mike Dunlavey

@Mike Alan Kay, mikrobiyoloji eğitiminden çok ilham aldığını söylüyor. Özellikle, bir nesneyi kavraması hücreye dayanıyordu (ve onun makalelerinden / konuşmalarından hangisinde bahsettiğini hatırlamıyorum).
Frank Shearar

1

Bir örnek için fiziksel bir nesne kullanma ve örnek olarak fiziksel olmayan bir nesne kullanma konusunda çok az fark olduğunu iddia ediyorum. Kod olarak her ikisi de aynı parçalara sahiptir. Grafik örneğini kullanır ve Küre, küp, silindir ile öğretirsek, top, kutu, kutup kullanmakla neredeyse aynıdır.

Bu yüzden fiziksel örnekler kullanmadan öğretmek için hiç örnek kullanmamanızı öneririm, ama neden fiziksel örnekler istemeyeceğinizi anlamıyorum, bu yüzden konu hakkındaki tutumum

Hayır, bunu fiziksel gerçek dünya nesneleri olmadan öğretmemelisiniz


1

Gerçek dünya metaforlarına başlamaktan nasıl kaçınabileceğinizi görmüyorum , ama orada kalmak istemezsiniz . OOP'u doğru yapıyorsanız, hızlı bir şekilde soyutlaşır, ancak bir sonraki anlayış düzeyinde, öğrenci nesneleri nesne olarak anlamalıdır.


1

İlginçtir ki en sevdiğim örneklerimden bazıları fiziksel nesneler değil. Örneğin Banka Hesabını ele alalım. Herkes, bakiyenin değerini değiştirmek ve servis ücretini almayı hatırlamak yerine arama koduna güvenmek yerine, depozito () ve pulldraw () 'in neden hizmet ücretini alması gerektiğini "alır". Ekrandaki şekiller iki kat somut değildir ve Stroustrup bana klasik "Şekiller" örneğinin 40 yıl öncesine ait bildiği en eski iki OO örneğinden biri olduğunu söyledi (diğeri şimdi 44 yaşında olan araçlar).

Önemli olan, insanların örneklerinizi hemen anlamalarıdır. Asansörler sadece asansöre aşina olan insanlara iyi bir örnektir. Vb.


1

Bir programlama grubundaysanız, birkaç kişiyi bir araya getirin ve sisteme ne yapmanız gerektiğini yapmak için birbirlerine nasıl söyleyeceğinizi tartışmaya başlayın. Kelimenin tam anlamıyla sistemde rol al (bunu her rolü oynayarak kendi başına yapabilirsin, ama bir grup insanla daha kolay. Sahip oldukları verilere değil, her bir kişinin ne yaptığına / yapacaklarına odaklanın. Bunu insanlarla yapmak, mesajlara ve rollere odaklanmaya yardımcı olur, çünkü insanlar ne yaptıklarını hatırlıyorlar, ancak sahip oldukları verileri hatırlamıyorlar.

Birbirinden ne yapman gerektiğini sorman gerektiğini ve bunu yapmak için hangi bilgilere ihtiyacın olduğunu not al. Başka bir programcı verilerinizi hayır deyin diye sorarsa ve neden ona ihtiyaç duyduğunu sorarsa (verilerin kapsüllenmesine yardımcı olur) kendi verilerinizi koruyun.


Ayrıca, sadece veri toplama olan nesneleriniz olup olmadığını öğrenmek için iyi bir yol olduğunu da ekleyeceksiniz, çünkü kelimenin tam anlamıyla yapacak hiçbir şeyi olmayan biriyle sonuçlanacaksınız. Öyleyse kullanılan nesne verilerinin nerede olduğunu düşünün ve bu verilerin bu nesnelerde olması daha anlamlı olur.
Cormac Mulhall

0

Ben aşağıdan yukarıya / metal bir yaklaşım yararlı olabilir düşünüyorum. Öncelikle, doğrudan ilkelleri kullanmak yerine verilerin nasıl yapılandırılabileceğini göstermek için C tarzı yapıları ve işaretçileri açıklayın. Sonra geç bağlama ve fonksiyon göstergelerini açıklayınız. Daha sonra bunları temelde iyi kapsüllenmiş veri yığınları ve adı geçen veriler üzerinde çalışması için gereken işlevlere işaret eden nesneler oluşturmak için kullanabileceğinizi açıklayın.

Bu açıklama, kavramın uygulamadan bağımsız olarak öğretilmesinin geleneksel matematik / comp-sci yoluyla çelişmektedir, ancak beni (kuşkusuz bir compi sci, arka planı olmayan bir mühendisliğe sahip biri) sonunda OO elde eden perspektiftir.

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.