Nesne yönelimli programlama - Object-oriented programming

Nesne yönelimli programlama ( OOP ), veri ve kod içerebilen " nesneler " kavramına dayanan bir programlama paradigmasıdır : alanlar biçimindeki veriler (genellikle nitelikler veya özellikler olarak bilinir ) ve prosedürler biçimindeki kod (genellikle yöntemler olarak bilinir ).

Nesnelerin bir özelliği, bir nesnenin kendi prosedürlerinin, kendisinin veri alanlarına erişebilmesi ve sıklıkla bunları değiştirebilmesidir (nesnelerin veya kavramı vardır ). OOP'de bilgisayar programları, birbirleriyle etkileşime giren nesnelerden oluşturularak tasarlanır. OOP dilleri çeşitlidir, ancak en popüler olanları sınıf tabanlı nesnelerdir, yani örnekleri arasında sınıfların aynı zamanda onların belirlemek, türleri . thisself

En yaygın olarak kullanılan programlama dillerinin çoğu (örneğin C++, Java, Python, vb.) çok paradigmalıdır ve tipik olarak zorunlu , prosedürel programlama ile birlikte, az veya çok nesne yönelimli programlamayı desteklerler . Önemli nesne yönelimli diller şunları içerir: Java , C++ , C# , Python , R , PHP , Visual Basic.NET , JavaScript , Ruby , Perl , SIMSCRIPT , Object Pascal , Objective-C , Dart , Swift , Scala , Kotlin , Common Lisp , MATLAB ve Smalltalk .

Tarih

Bir sınıf için UML gösterimi. Bu Button sınıfında data ve function değişkenleri bulunur . Kalıtım yoluyla, Button sınıfının alt kümesi olarak bir alt sınıf oluşturulabilir. Nesneler bir sınıfın örnekleridir.

Modern anlamda nesne yönelimli programlama anlamında "nesneler" ve "yönelimli" terimler MIT'de ilk kez 1950'lerin sonlarında ve 1960'ların başlarında ortaya çıktı. Yapay zeka grubunun ortamında, 1960 gibi erken bir tarihte "nesne" , özellikleri (nitelikleri) olan tanımlanmış öğelere ( LISP atomları) atıfta bulunabilir; Alan Kay daha sonra, 1966'daki düşüncesi üzerinde güçlü bir etki olarak LISP'in iç bileşenlerinin ayrıntılı bir şekilde anlaşılmasından bahsetti.

Nesnelerin biyolojik hücreler ve/veya bir ağdaki bireysel bilgisayarlar gibi olduğunu, yalnızca mesajlarla iletişim kurabildiğini düşündüm (böylece mesajlaşma en başta geldi - bir programlama dilinde mesajlaşmanın yeterince verimli bir şekilde nasıl yapıldığını görmek biraz zaman aldı). kullanışlı).

Alan Kay,

Bir başka erken MIT örneği, 1960-1961'de Ivan Sutherland tarafından oluşturulan Sketchpad ; Sutherland, Sketchpad hakkındaki tezine dayanan 1963 teknik raporunun sözlüğünde, "nesne" ve "örnek" (sınıf kavramının "usta" veya "tanım" tarafından kapsanan) kavramlarını tanımladı, ancak grafiksel etkileşime özelleştirildi. Ayrıca, bir MIT ALGOL versiyonu, AED-0, veri yapıları (bu lehçede "pleksler") ile prosedürler arasında doğrudan bir bağlantı kurarak daha sonra "mesajlar", "yöntemler" ve "üye işlevleri" olarak adlandırılanları önceden yapılandırdı.

1962'de Kristen Nygaard , önceki Monte Carlo simülasyonu kullanımına ve gerçek dünya sistemlerini kavramsallaştırma çalışmalarına dayanarak Norveç Bilgi İşlem Merkezi'nde bir simülasyon dili için bir proje başlattı . Ole-Johan Dahl projeye resmi olarak katıldı ve Simula programlama dili, Evrensel Otomatik Bilgisayar (UNIVAC) 1107 üzerinde çalışacak şekilde tasarlandı. Simula, bugün nesne yönelimli programlamanın önemli bir parçası olan sınıf ve nesne , kalıtım gibi önemli kavramları tanıttı. , ve dinamik bağlama . Simula ayrıca programlama ve veri güvenliğini hesaba katacak şekilde tasarlanmıştır . Güvenlik amacıyla programlamak için bir algılama işlemi uygulandı, böylece referans sayımları aracılığıyla bir son çare çöp toplayıcı rastgele erişimli bellekteki (RAM) kullanılmayan nesneleri sildi . Ancak, veri nesneleri fikri 1965'te zaten kurulmuş olmasına rağmen, özel (-) ve genel (+) gibi değişkenler için kapsam seviyeleri aracılığıyla veri kapsülleme , erişim prosedürlerinin olmasını gerektireceğinden Simula'da uygulanmadı. da gizli.

İlk aşamalarda, Simula'nın ALGOL 60 programlama dili için bir prosedür paketi olması gerekiyordu. ALGOL tarafından getirilen kısıtlamalardan memnun olmayan araştırmacılar, Simula'yı UNIVAC ALGOL 60 derleyicisini kullanan tam teşekküllü bir programlama dili haline getirmeye karar verdiler. Simula, 1965 ve 1966 boyunca Dahl ve Nygaard tarafından desteklendi ve İsveç, Almanya ve Sovyetler Birliği'nde programlama dilinin kullanımının artmasına yol açtı . 1968'de dil, Burroughs B5500 bilgisayarları aracılığıyla yaygın olarak kullanılabilir hale geldi ve daha sonra URAL-16 bilgisayarında da uygulandı . 1966'da Dahl ve Nygaard bir Simula derleyicisi yazdılar . Serbest biçimli, İngilizce benzeri genel amaçlı simülasyon dili SIMSCRIPT'de uygulanan Tony Hoare'nin rekor sınıf konseptini uygulamaya koymakla meşgul oldular . Kayıt sınıfı özelliklerine ve ikinci bir önek katmanına sahip genelleştirilmiş bir süreç konseptine karar verdiler. Önekleme yoluyla, bir süreç öncülüne başvurabilir ve ek özelliklere sahip olabilir. Simula böylece sınıf ve alt sınıf hiyerarşisini ve bu sınıflardan nesne üretme olasılığını tanıttı.

Bir Simula 67 derleyici için başlatılan System / 360 ve System / 370 , IBM anabilgisayar bilgisayarlar bir Simula 67 derleyici Fransız için ücretsiz olarak başlatıldı Aynı yıl 1972'de CII 10070 ve CII İris 80 ana bilgisayarlar . 1974'te Simula Kullanıcıları Derneği'nin 23 farklı ülkede üyesi vardı. 1975'in başlarında, DECsystem-10 ana bilgisayar ailesi için bir Simula 67 derleyicisi ücretsiz olarak piyasaya sürüldü . Aynı yılın Ağustos ayına kadar, DECsystem-10 Simula 67 derleyicisi, 22'si Kuzey Amerika'da olmak üzere 28 tesiste kuruldu. Nesne yönelimli Simula programlama dili, esas olarak, gemilerin hareketini ve kargo limanları yoluyla içeriklerini incelemek ve geliştirmek için modeller gibi fiziksel modelleme ile ilgili araştırmacılar tarafından kullanılmıştır .

1970'lerde Smalltalk programlama dilinin ilk versiyonu Xerox PARC'da Alan Kay , Dan Ingalls ve Adele Goldberg tarafından geliştirildi . Smaltalk-72 bir programlama ortamı dahil edildi ve dinamik olarak yazılan ve ilk edildi de yorumlanır değil, derlenmiş . Smalltalk, dil düzeyinde nesne yönelimi uygulaması ve grafik geliştirme ortamıyla dikkat çekti. Smalltalk çeşitli versiyonlardan geçti ve dile ilgi arttı. Smalltalk, Simula 67'de tanıtılan fikirlerden etkilenirken, sınıfların dinamik olarak oluşturulabileceği ve değiştirilebileceği tamamen dinamik bir sistem olarak tasarlandı.

1970'lerde Smalltalk, Lisp topluluğunu geliştiricilere Lisp makinesi aracılığıyla tanıtılan nesne tabanlı teknikleri dahil etme konusunda etkiledi . (Örneğin LOOPS gibi Lisp için çeşitli uzantılara sahip Deneme Tatlandırıcılar tanıtan çoklu kalıtım ve katmalar sonunda yol açtı) Ortak Lisp Nesne Sistemi fonksiyonel programlama ve nesne yönelimli programlama entegre ve üzeri uzatılmasına olanak verir, Meta-nesne protokolü . 1980'lerde, bellekteki nesneler için donanım desteği içeren işlemci mimarileri tasarlamaya yönelik birkaç girişim vardı, ancak bunlar başarılı olmadı. Örnekler arasında Intel iAPX 432 ve Linn Smart Rekursiv bulunmaktadır .

1981'de Goldberg , Smalltalk ve nesne yönelimli programlamayı daha geniş bir kitleye tanıtan Byte Magazine'in Ağustos sayısını düzenledi . 1986'da Bilgisayar Makineleri Derneği , beklenmedik bir şekilde 1.000 kişinin katıldığı ilk Nesne Yönelimli Programlama, Sistemler, Diller ve Uygulamalar Konferansı'nı (OOPSLA) düzenledi. 1980'lerin ortalarında Objective-C , Smalltalk'ı ITT Inc.'de kullanan Brad Cox ve doktora tezi için Simula'yı kullanan Bjarne Stroustrup tarafından geliştirildi ve sonunda nesne yönelimli C++' ı yaratmaya gitti . 1985 yılında Bertrand Meyer , Eyfel dilinin ilk tasarımını da üretti . Yazılım kalitesine odaklanan Eiffel, tamamen nesne yönelimli bir programlama dili ve tüm yazılım yaşam döngüsünü destekleyen bir gösterimdir. Meyer, Eiffel yazılım geliştirme yöntemini, yazılım mühendisliği ve bilgisayar bilimlerinden elde edilen az sayıdaki temel fikre dayalı olarak, Nesneye Yönelik Yazılım İnşaatı'nda tanımladı . Eiffel'in kalite odağı için esas olan, Meyer'in hem yöntemin hem de dilin ayrılmaz bir parçası olan Sözleşmeye Göre Tasarım adlı güvenilirlik mekanizmasıdır .

TIOBE programlama dili popülerlik endeksi 2002'den 2018 için grafik 2000'li yıllarda nesne yönelimli Java (mavi) ve prosedürel C üst konum için yarıştı (siyah).

1990'ların başlarında ve ortalarında , teknikleri destekleyen programlama dilleri yaygın olarak kullanılabilir hale geldiğinde , nesne yönelimli programlama baskın programlama paradigması olarak gelişti . Bunlara Visual FoxPro 3.0, C++ ve Delphi dahildir . Baskınlığı, ağırlıklı olarak nesne yönelimli programlama tekniklerine dayanan grafik kullanıcı arayüzlerinin artan popülaritesi ile daha da geliştirildi . Yakından ilgili bir dinamik GUI kitaplığı ve OOP dili örneği , Smalltalk'a dayalı C'ye nesne yönelimli, dinamik bir mesajlaşma uzantısı olan Objective-C ile yazılmış Mac OS X'teki Cocoa çerçevelerinde bulunabilir . OOP araç takımları, olaya dayalı programlamanın popülaritesini de artırdı (bu kavram OOP ile sınırlı olmasa da).

At ETH Zürich , Niklaus Wirth ve arkadaşları da gibi konuları araştıran olmuştu veri soyutlama ve modüler programlama (bu 1960'larda veya daha önceki ortak kullanımda olmuştu rağmen). Modula-2 (1978) her ikisini de içeriyordu ve sonraki tasarımları Oberon , nesne yönelimi, sınıflar ve benzerlerine farklı bir yaklaşım içeriyordu.

Ada , BASIC , Fortran , Pascal ve COBOL dahil olmak üzere önceden var olan birçok dile nesne yönelimli özellikler eklenmiştir . Bu özelliklerin başlangıçta onlar için tasarlanmamış dillere eklenmesi, genellikle kodun uyumluluğu ve bakımıyla ilgili sorunlara yol açtı.

Daha yakın zamanlarda, öncelikle nesne yönelimli olan, ancak aynı zamanda prosedürel metodoloji ile uyumlu olan bir dizi dil ortaya çıktı. Bu tür iki dil Python ve Ruby'dir . Muhtemelen en değerli ticari son nesne yönelimli dillerdir Java tarafından geliştirilen, Sun Microsystems , hem de C # ve Visual Basic.NET (VB.NET), Microsoft'un için tasarlanmış hem .NET platformu. Bu iki çerçevenin her biri, kendi yolunda, uygulamadan bir soyutlama oluşturarak OOP kullanmanın faydasını gösterir. VB.NET ve C# diller arası kalıtımı destekler ve bir dilde tanımlanan sınıfların diğer dilde tanımlanan alt sınıf sınıflarına izin verir.

Özellikleri

Nesne yönelimli programlama nesneleri kullanır, ancak ilişkili tekniklerin ve yapıların tümü OOP'yi desteklediğini iddia eden dillerde doğrudan desteklenmez. Aşağıda listelenen özellikler , belirtilen önemli istisnalar dışında, güçlü bir şekilde sınıf ve nesne yönelimli (veya OOP destekli çoklu paradigma ) olarak kabul edilen diller arasında yaygındır .

OOP dışı dillerle paylaşıldı

Modüler programlama desteği, organizasyonel amaçlar için prosedürleri dosyalar ve modüller halinde gruplandırma yeteneği sağlar. Modüller ad alanlıdır, böylece bir modüldeki tanımlayıcılar, başka bir dosya veya modülde aynı adı paylaşan bir prosedür veya değişkenle çakışmaz.

Nesneler ve sınıflar

Nesne yönelimli programlamayı (OOP) destekleyen diller, genellikle kodun yeniden kullanımı ve sınıflar veya prototipler biçiminde genişletilebilirlik için kalıtımı kullanır . Sınıfları kullananlar iki ana kavramı destekler:

  • Sınıflar – belirli bir nesne türü veya sınıfı için veri formatı ve mevcut prosedürler için tanımlar; ayrıca verileri ve prosedürleri (sınıf yöntemleri olarak bilinir) kendileri içerebilir, yani sınıflar veri üyelerini ve üye işlevlerini içerir
  • Nesneler – sınıf örnekleri

Nesneler bazen gerçek dünyada bulunan şeylere karşılık gelir. Örneğin, bir grafik programında "daire", "kare", "menü" gibi nesneler olabilir. Bir çevrimiçi alışveriş sistemi, "alışveriş sepeti", "müşteri" ve "ürün" gibi nesnelere sahip olabilir. Bazen nesneler, açık bir dosyayı temsil eden bir nesne veya ölçümleri ABD'de alışılmış olandan metriğe çevirme hizmetini sağlayan bir nesne gibi daha soyut varlıkları temsil eder.

Nesne yönelimli programlama, yalnızca sınıflar ve nesnelerden daha fazlasıdır; veri alanlarını ve yöntemlerini içeren [ sic ] nesneler (veri yapıları) üzerine kurulu tam bir programlama paradigmasıdır . Bunu anlamak önemlidir; Bir grup ilgisiz yöntemi bir arada düzenlemek için sınıfları kullanmak, nesne yönelimi değildir.

Junade Ali, PHP Tasarım Modellerinde Ustalaşmak

Her nesnenin belirli bir sınıfın örneği olduğu söylenir (örneğin, ad alanı "Mary" olarak ayarlanmış bir nesne, Çalışan sınıfının bir örneği olabilir). Nesne yönelimli programlamadaki prosedürler metotlar olarak bilinir ; değişkenler alanlar , üyeler, nitelikler veya özellikler olarak da bilinir . Bu, aşağıdaki terimlere yol açar:

  • Sınıf değişkenleribir bütün olarak sınıfa aittir ; her birinin sadece bir kopyası var
  • Örnek değişkenleri veya nitelikleri – tek tek nesnelere ait veriler ; her nesnenin her birinin kendi kopyası vardır
  • Üye değişkenler – belirli bir sınıf tarafından tanımlanan hem sınıf hem de örnek değişkenleri ifade eder
  • Sınıf yöntemleri - bir bütün olarak sınıfa aittir ve yalnızca prosedür çağrısından sınıf değişkenlerine ve girdilerine erişime sahiptir.
  • Örnek yöntemler – bireysel nesnelere aittir ve çağrıldıkları belirli nesne için örnek değişkenlere, girdilere ve sınıf değişkenlerine erişime sahiptir.

Nesnelere, karmaşık iç yapıya sahip değişkenler gibi erişilir ve birçok dilde, bir yığın veya yığın içindeki bellekteki söz konusu nesnenin tek bir örneğine gerçek referanslar olarak hizmet eden etkili bir şekilde işaretçilerdir . Dahili kodu harici koddan ayırmak için kullanılabilecek bir soyutlama katmanı sağlarlar . Harici kod, belirli bir girdi parametresi kümesiyle belirli bir örnek yöntemini çağırarak, bir örnek değişkeni okuyarak veya bir örnek değişkenine yazarak bir nesneyi kullanabilir. Nesneler, kurucu olarak bilinen sınıfta özel bir yöntem türü çağrılarak oluşturulur . Bir program, çalıştığı gibi bağımsız olarak çalışan aynı sınıfın birçok örneğini oluşturabilir. Bu, aynı prosedürlerin farklı veri kümelerinde kullanılması için kolay bir yoldur.

Sınıfları kullanan nesne yönelimli programlamaya bazen sınıf tabanlı programlama denir , prototip tabanlı programlama genellikle sınıfları kullanmaz. Sonuç olarak, nesne ve örnek kavramlarını tanımlamak için önemli ölçüde farklı ancak benzer terminoloji kullanılır .

Bazı dillerde sınıflar ve nesneler, nitelikler ve karışımlar gibi diğer kavramlar kullanılarak oluşturulabilir .

Sınıf tabanlı vs prototip tabanlı

In sınıf tabanlı dillerde sınıflar önceden tanımlanmış ve nesneler sınıfları dayalı örneği. Fruit sınıfından iki nesne elma ve portakal somutlaştırılırsa , bunlar doğal olarak meyvelerdir ve bunları aynı şekilde işleyebileceğiniz garanti edilir; örneğin bir programcı color veya Sugar_content veya is_ripe gibi aynı özniteliklerin varlığını bekleyebilir .

In prototip tabanlı diller nesneler birincil varlıklardır. Hiçbir sınıfları bile var. Prototip bir nesnenin nesne bağlantılı olduğu başka bir nesnedir. Her nesnenin bir prototip bağlantısı vardır (ve yalnızca bir tane). Prototip olarak seçilen mevcut nesnelere dayalı olarak yeni nesneler oluşturulabilir. İki farklı nesneler çağırabilir elma ve portakal nesne varsa, bir meyve meyve var ve her iki elma ve portakal sahip meyve onların prototip olarak. Meyve sınıfı fikri açık bir şekilde değil , aynı prototipi paylaşan nesnelerin denklik sınıfı olarak var olur. Nitelikleri ve yöntemleri prototip olan devredilen bu prototip ile tanımlanan denklik sınıfın tüm nesnelere. Nesnenin tek tek sahip olduğu nitelikler ve yöntemler , aynı denklik sınıfındaki diğer nesneler tarafından paylaşılamaz; örneğin nitelik sugar_content beklenmedik mevcut olmayabilir elma . Prototip aracılığıyla yalnızca tek bir kalıtım uygulanabilir.

Dinamik gönderme/mesaj geçişi

Bir yöntem çağrısına yanıt olarak yürütülecek yordamsal kodu seçmek, genellikle nesneyle ilişkili bir tabloda çalışma zamanında yöntemi arayarak, herhangi bir harici kodun değil nesnenin sorumluluğundadır. Bu özellik dinamik gönderme olarak bilinir ve bir nesneyi, tüm örnekler için işlemlerin sabit (statik) bir uygulamasına sahip olan soyut bir veri türünden (veya modülünden) ayırır . Çağrı değişkenliği, çağrıldığı nesnenin tek türünden daha fazlasına dayanıyorsa (yani, yöntem seçiminde en az bir başka parametre nesnesi dahil), birden fazla gönderimden söz edilir .

Bir yöntem çağrısı, mesaj geçişi olarak da bilinir . Gönderilmek üzere nesneye iletilen bir mesaj (yöntemin adı ve giriş parametreleri) olarak kavramsallaştırılır.

kapsülleme

Kapsülleme, verileri ve verileri işleyen işlevleri birbirine bağlayan ve hem dış müdahalelerden hem de yanlış kullanımdan koruyan nesne yönelimli bir programlama konseptidir. Veri kapsülleme, önemli OOP veri gizleme kavramına yol açtı .

Bir sınıf, çağrı kodunun dahili nesne verilerine erişmesine izin vermiyorsa ve yalnızca yöntemlerle erişime izin veriyorsa, bu, kapsülleme olarak bilinen güçlü bir soyutlama veya bilgi gizleme biçimidir . Bazı diller (örneğin Java), sınıfların erişim kısıtlamalarını açıkça uygulamasına izin verir; örneğin, privateanahtar kelimeyle dahili verileri belirtmek ve anahtar kelimeyle sınıfın dışındaki kod tarafından kullanılması amaçlanan yöntemleri belirlemek public. Yöntemler ayrıca genel, özel veya protected(aynı sınıftan ve alt sınıflarından erişime izin verir, ancak farklı bir sınıfın nesnelerinden erişime izin vermez) gibi orta düzeylerde tasarlanabilir . Diğer dillerde (Python gibi) bu yalnızca kurala göre uygulanır (örneğin, privateyöntemler alt çizgi ile başlayan adlara sahip olabilir ). Kapsülleme, harici kodun bir nesnenin iç işleyişiyle ilgilenmesini engeller. Bu, kodun yeniden düzenlenmesini kolaylaştırır , örneğin sınıfın yazarının, herhangi bir harici kodu değiştirmeden o sınıfın nesnelerinin verilerini dahili olarak nasıl temsil ettiğini değiştirmesine izin verir ("genel" yöntem çağrıları aynı şekilde çalıştığı sürece). Ayrıca programcıları, belirli bir veri kümesiyle ilgili tüm kodu aynı sınıfa koymaya teşvik eder ve bu da onu diğer programcılar tarafından kolay anlaşılacak şekilde düzenler. Kapsülleme, ayrıştırmayı teşvik eden bir tekniktir .

Kompozisyon, miras ve delegasyon

Nesneler, örnek değişkenlerinde başka nesneler içerebilir; bu, nesne bileşimi olarak bilinir . Örneğin, Employee sınıfındaki bir nesne, "first_name" ve "position" gibi kendi örnek değişkenlerine ek olarak (doğrudan veya bir işaretçi aracılığıyla) Address sınıfındaki bir nesneyi içerebilir. Nesne kompozisyonu "bir-bir" ilişkisini temsil etmek için kullanılır: her çalışanın bir adresi vardır, bu nedenle her Çalışan nesnesinin bir Adres nesnesini depolamak için bir yere erişimi vardır (doğrudan kendi içinde gömülü veya bir işaretçi aracılığıyla adreslenen ayrı bir konumda) .

Sınıfları destekleyen diller neredeyse her zaman kalıtımı destekler . Bu, sınıfların "bir türdür" ilişkilerini temsil eden bir hiyerarşide düzenlenmesini sağlar. Örneğin, Çalışan sınıfı, Kişi sınıfından miras alabilir. Üst sınıf için mevcut olan tüm veriler ve yöntemler, aynı adla alt sınıfta da görünür. Örneğin, Person sınıfı, "make_full_name()" yöntemiyle "first_name" ve "last_name" değişkenlerini tanımlayabilir. Bunlar ayrıca "pozisyon" ve "maaş" değişkenlerini ekleyebilecek olan Çalışan sınıfında da mevcut olacaktır. Bu teknik, gerçek dünya ilişkilerini sezgisel bir şekilde yansıtmaya ek olarak, aynı prosedürlerin ve veri tanımlarının kolayca yeniden kullanılmasına izin verir. Geliştirici, veritabanı tablolarını ve programlama alt programlarını kullanmak yerine, kullanıcının daha aşina olabileceği nesneleri kullanır: kendi uygulama etki alanındaki nesneler.

Alt sınıflar, üst sınıflar tarafından tanımlanan yöntemleri geçersiz kılabilir. Bazı dillerde çoklu mirasa izin verilir, ancak bu, geçersiz kılmaları çözmeyi karmaşık hale getirebilir. Bazı dillerin mixins için özel desteği vardır , ancak birden çok kalıtımın olduğu herhangi bir dilde bir mixin, yalnızca bir tür ilişkisini temsil etmeyen bir sınıftır. Mixin'ler genellikle aynı yöntemleri birden çok sınıfa eklemek için kullanılır. Örneğin, UnicodeConversionMixin sınıfı, ortak bir üst öğeyi paylaşmayan FileReader ve WebPageScraper sınıfına dahil edildiğinde unicode_to_ascii() yöntemini sağlayabilir.

Soyut sınıflar nesnelere örneklenemez; yalnızca somutlaştırılabilen diğer "somut" sınıflara kalıtım amacıyla var olurlar. Java'da finalanahtar kelime, bir sınıfın alt sınıflanmasını önlemek için kullanılabilir.

Miras yerine kompozisyon doktrini, kalıtım yerine kompozisyon kullanarak has-a ilişkilerinin uygulanmasını savunur. Örneğin, Person sınıfından miras almak yerine, Employee sınıfı her bir Employee nesnesine bir dahili Person nesnesi verebilir ve bu nesne, daha sonra, Person sınıfının birçok genel özniteliği veya yöntemi olsa bile, harici koddan gizleme olanağına sahiptir. Go gibi bazı diller kalıtımı hiç desteklemez.

" Açık/kapalı ilkesi ", sınıfların ve işlevlerin "genişletmeye açık, ancak değişikliğe kapalı" olması gerektiğini savunur.

Delegasyon , mirasa alternatif olarak kullanılabilecek başka bir dil özelliğidir.

polimorfizm

Alt tipleme - bir polimorfizm biçimi - çağrı kodunun desteklenen hiyerarşide hangi sınıfta çalıştığı konusunda agnostik olabileceği zamandır - ana sınıf veya onun alt sınıflarından biri. Bu arada, bir kalıtım hiyerarşisindeki nesneler arasında aynı işlem adı farklı davranabilir.

Örneğin, Circle ve Square türündeki nesneler Shape adlı ortak bir sınıftan türetilir. Her Şekil türü için Çiz işlevi, kod çağrılırken çizilen belirli bir Şekil türüne kayıtsız kalabilirken, kendisini çizmek için gerekli olanı uygular.

Bu, sınıf hiyerarşisinin dışındaki kodu basitleştiren ve kaygıların güçlü bir şekilde ayrılmasını sağlayan başka bir soyutlama türüdür .

Açık özyineleme

Destekleyen dillerde açık özyinelemeye , nesne yöntemleri tipik adı verilen özel bir değişkeni veya anahtar kelime kullanarak, (kendileri de dahil) aynı nesne üzerinde diğer yöntemleri çağırabilir thisya self. Bu değişken geç bağlıdır ; bir sınıfta tanımlanan bir yöntemin, bazı alt sınıflarında daha sonra tanımlanan başka bir yöntemi çağırmasına izin verir.

OOP dilleri

Simula (1967), genellikle nesne yönelimli bir dilin temel özelliklerine sahip ilk dil olarak kabul edilir. Nesneler olarak adlandırılanların en önemli bilgi temsili olduğu simülasyon programları yapmak için yaratılmıştır . Smalltalk (1972 - 1980) başka bir erken örnektir ve OOP teorisinin çoğunun geliştirildiği örnektir. Nesne yöneliminin derecesi ile ilgili olarak aşağıdaki ayrımlar yapılabilir:

Dinamik dillerde OOP

Son yıllarda nesne yönelimli programlama özellikle dinamik programlama dillerinde popüler hale geldi . Python , PowerShell , Ruby ve Groovy OOP ilkelerine dayalı dinamik dillerdir; Perl ve PHP ise Perl 5 ve PHP 4'ten beri nesne yönelimli özellikler ve sürüm 6'dan beri ColdFusion ekliyor .

Belge Nesne Modeli ait HTML , XHTML ve XML internette dokümanların popüler bağlamaları vardır JavaScript / ECMAScript dilinin. JavaScript, belki de bir sınıftan miras almak yerine prototiplerden klonlamayı kullanan en iyi bilinen prototip tabanlı programlama dilidir ( sınıf tabanlı programlamanın aksine ). Bu yaklaşımı benimseyen başka bir betik dili Lua'dır .

Bir ağ protokolünde OOP

İstemci-sunucu ortamında hizmet talep etmek için bilgisayarlar arasında akan mesajlar, hem istemci hem de sunucu tarafından bilinen sınıf nesneleri tarafından tanımlanan nesnelerin doğrusallaştırılması olarak tasarlanabilir. Örneğin, basit bir doğrusallaştırılmış nesne bir uzunluk alanından, sınıfı tanımlayan bir kod noktasından ve bir veri değerinden oluşur. Daha karmaşık bir örnek, komutun uzunluk ve kod noktasından ve komutun parametrelerini temsil eden doğrusallaştırılmış nesnelerden oluşan değerlerden oluşan bir komut olabilir. Bu tür her komut, sunucu tarafından sınıfı (veya üst sınıfı) komutu tanıyan ve istenen hizmeti sağlayabilen bir nesneye yönlendirilmelidir. İstemciler ve sunucular en iyi şekilde karmaşık nesne yönelimli yapılar olarak modellenir. Dağıtılmış Veri Yönetimi Mimarisi (DDM) bu yaklaşımı benimsedi ve nesneleri resmi bir hiyerarşinin dört düzeyinde tanımlamak için sınıf nesnelerini kullandı:

  • Uzunluk, kod noktası ve veri değerleri gibi mesajları oluşturan veri değerlerini tanımlayan alanlar.
  • Mesajlar ve parametreler için Smalltalk programında bulunabileceklere benzer nesneler ve nesne koleksiyonları .
  • IBM i Objects'e benzer yöneticiler , örneğin meta veriler ve kayıtlardan oluşan dosyalara ve dosyalara yönelik bir dizin. Yöneticiler kavramsal olarak içerdikleri nesneler için bellek ve işlem kaynakları sağlar.
  • Dizin hizmetleri, güvenlik ve eşzamanlılık denetimi gibi yönleri destekleyen, eksiksiz bir işleme ortamı uygulamak için gerekli tüm yöneticilerden oluşan bir istemci veya sunucu.

DDM'nin ilk sürümü, dağıtılmış dosya hizmetlerini tanımladı. Daha sonra Dağıtılmış İlişkisel Veritabanı Mimarisi'nin (DRDA) temeli olacak şekilde genişletildi .

Tasarım desenleri

Nesne yönelimli tasarımın zorlukları birkaç yaklaşımla ele alınmaktadır. En yaygın olanı, Gamma ve diğerleri tarafından kodlanan tasarım kalıpları olarak bilinir . . Daha geniş olarak, " tasarım desenleri " terimi , yazılım tasarımında yaygın olarak ortaya çıkan bir soruna yönelik herhangi bir genel, tekrarlanabilir çözüm modeline atıfta bulunmak için kullanılabilir. Bu yaygın olarak ortaya çıkan sorunlardan bazıları, nesne yönelimli geliştirmeye özgü çıkarımlara ve çözümlere sahiptir.

Kalıtım ve davranışsal alt tipleme

Kalıtımın semantik bir " bir " ilişki oluşturduğunu varsaymak ve böylece alt sınıflardan somutlaştırılan nesnelerin üst sınıftan örneklenenler yerine her zaman güvenli bir şekilde kullanılabileceği sonucunu çıkarmak sezgiseldir . Bu sezgi ne yazık ki çoğu OOP dilinde, özellikle de değiştirilebilir nesnelere izin veren tüm dillerde yanlıştır . OOP dillerinde (değişebilir nesnelerle) tür denetleyicisi tarafından zorlanan alt tür polimorfizmi , herhangi bir bağlamda davranışsal alt tiplemeyi garanti edemez . Davranışsal alt tipleme genel olarak kararsızdır, bu nedenle bir program (derleyici) tarafından uygulanamaz. Sınıf veya nesne hiyerarşileri, sözdizimsel olarak tespit edilemeyen olası yanlış kullanımlar göz önünde bulundurularak dikkatlice tasarlanmalıdır. Bu konu Liskov ikame ilkesi olarak bilinir .

Dörtlü tasarım desenleri çetesi

Design Patterns: Elements of Reusable Object-Oriented Software , 1994 yılında Erich Gamma , Richard Helm , Ralph Johnson ve John Vlissides tarafından yayınlananvegenellikle mizahi bir şekilde "Dörtlü Çete" olarak anılanetkili bir kitaptır. Nesne yönelimli programlamanın yeteneklerini ve tuzaklarını keşfetmenin yanı sıra, bunları çözmek için 23 yaygın programlama problemini ve modelini açıklar. Nisan 2007 itibariyle kitap 36. baskısındaydı.

Kitap aşağıdaki kalıpları açıklar:

Nesne yönelimi ve veritabanları

Hem nesne yönelimli programlama hem de ilişkisel veritabanı yönetim sistemleri (RDBMS'ler) günümüzde yazılımlarda oldukça yaygındır. Yana ilişkisel veri tabanları (bazı RDBMSs bu yaklaşmak için nesne yönelimli özelliklere sahip olsa da) değil mağaza doğrudan nesneleri yapmak, iki dünyayı köprü genel bir ihtiyaç vardır. İlişkisel veritabanları ile nesne yönelimli programlama erişimleri ve veri kalıpları arasında köprü kurma sorunu, nesne-ilişkisel empedans uyumsuzluğu olarak bilinir . Bu sorunla başa çıkmak için bir dizi yaklaşım vardır, ancak olumsuz yönleri olmayan genel bir çözüm yoktur. En yaygın yaklaşımlardan biri , Visual FoxPro gibi IDE dillerinde ve Java Data Objects ve Ruby on Rails 'ActiveRecord gibi kitaplıklarda bulunan nesne-ilişkisel eşlemedir.

RDBMS'leri değiştirmek için kullanılabilecek nesne veritabanları da vardır , ancak bunlar RDBMS'ler kadar teknik ve ticari olarak başarılı olmamıştır.

Gerçek dünya modellemesi ve ilişkileri

OOP, gerçek dünyadaki nesneleri ve süreçleri dijital muadilleriyle ilişkilendirmek için kullanılabilir. Ancak, OOP'nin doğrudan gerçek dünya haritalamayı kolaylaştırdığı ( Eleştiri bölümüne bakınız) veya gerçek dünya haritalamanın bile değerli bir hedef olduğu konusunda herkes hemfikir değildir ; Bertrand Meyer , Object-Oriented Software Construction'da , bir programın dünyanın bir modeli değil, dünyanın bir bölümünün modeli olduğunu savunuyor ; "Gerçeklik iki kez çıkarılmış bir kuzendir". Aynı zamanda, OOP'nin bazı temel sınırlamaları kaydedilmiştir. Örneğin, OOP'nin kalıtım kavramını kullanarak daire-elips probleminin üstesinden gelmek zordur .

Bununla birlikte, Niklaus Wirth (şimdi Wirth yasası olarak bilinen özdeyişi popülerleştirdi : "Yazılım, donanımın hızlanmasından daha hızlı bir şekilde yavaşlıyor"), OOP hakkında, "Aynanın İçinden İyi Fikirler" başlıklı makalesinde, "Bu paradigma, 'gerçek dünyada' sistemlerin yapısı ve bu nedenle karmaşık davranışları olan karmaşık sistemleri modellemek için çok uygundur" (kontrast KISS ilkesi ).

Steve Yegge ve diğerleri, doğal dillerin, eylemlerden (yöntemler/ fiiller ) önce şeylere (nesneler/ isimler ) kesin olarak öncelik veren OOP yaklaşımından yoksun olduğunu belirtti . Bu sorun, OOP'nin prosedürel programlamadan daha karmaşık çözümlere maruz kalmasına neden olabilir.

OOP ve kontrol akışı

OOP, kaynak kodun yeniden kullanılabilirliğini ve sürdürülebilirliğini artırmak için geliştirildi . Kontrol akışının şeffaf temsilinin önceliği yoktu ve bir derleyici tarafından ele alınması gerekiyordu. Paralel donanımın ve çok iş parçacıklı kodlamanın artan ilgisi ile şeffaf kontrol akışı geliştirmek daha önemli hale geliyor, OOP ile elde edilmesi zor bir şey.

Sorumluluk ve veri odaklı tasarım

Sorumluluk odaklı tasarım , sınıfları bir sözleşme açısından tanımlar, yani bir sınıf, bir sorumluluk ve paylaştığı bilgiler etrafında tanımlanmalıdır. Bu, Wirfs-Brock ve Wilkerson tarafından, tutulması gereken veri yapıları etrafında sınıfların tanımlandığı veri güdümlü tasarım ile karşılaştırılır . Yazarlar, sorumluluk odaklı tasarımın tercih edilir olduğuna inanıyorlar.

SOLID ve GRASP yönergeleri

SOLID , Michael Feathers tarafından icat edilen ve beş programlama uygulamasını temsil eden ve savunan bir anımsatıcıdır:

GRASP (Genel Sorumluluk Atama Yazılım Modelleri), Craig Larman tarafından savunulan başka bir yönergeler dizisidir .

eleştiri

OOP paradigması, belirtilen yeniden kullanılabilirlik ve modülerlik hedeflerini karşılamaması ve yazılım tasarımı ve modellemesinin (veri/nesneler) bir yönünü diğer önemli yönler (hesaplama/algoritmalar) pahasına aşırı vurgulaması da dahil olmak üzere bir dizi nedenden dolayı eleştirilmiştir. .

Luca Cardelli , OOP kodunun prosedürel koddan "özünde daha az verimli" olduğunu, OOP'nin derlenmesinin daha uzun sürebileceğini ve OOP dillerinin "sınıf genişletme ve değiştirme ile ilgili olarak son derece zayıf modülerlik özelliklerine" sahip olduğunu ve son derece karmaşık olma eğiliminde olduğunu iddia etti. . İkinci nokta ile tekrarlanmakta Joe Armstrong , başlıca mucidi Erlang şeklindeki sözleri edilir:

Nesne yönelimli dillerdeki sorun, yanlarında taşıdıkları tüm bu örtük ortama sahip olmalarıdır. Bir muz istedin ama elinde muzu ve tüm ormanı tutan bir goril vardı.

Potok ve ark. OOP ve prosedürel yaklaşımlar arasında üretkenlik açısından önemli bir fark göstermemiştir.

Christopher J. Date , OOP'nin üzerinde anlaşmaya varılmış ve titiz bir tanımının olmaması nedeniyle, OOP'nin diğer teknolojilerle, özellikle ilişkisel olan kritik karşılaştırmasının zor olduğunu belirtti; Ancak, Tarih ve Darwen özelleştirilebilir bir tür olarak kullandığı cepten o OOP üzerinde teorik bir temel önerdi tip sistemine desteklemek için RDBMS .

Lawrence Krubner bir makalesinde, diğer dillerle (LISP lehçeleri, işlevsel diller, vb.) karşılaştırıldığında, OOP dillerinin benzersiz bir güçlü yanı olmadığını ve gereksiz karmaşıklığın ağır bir yükü olduğunu iddia etti.

Alexander Stepanov , nesne yönelimini olumsuz bir şekilde genel programlamayla karşılaştırır :

OOP'yi teknik olarak sağlam buluyorum. Tek bir türe göre değişen arayüzler açısından dünyayı ayrıştırmaya çalışır. Gerçek problemlerle başa çıkmak için çok sıralı cebirlere ihtiyacınız var - birden çok türe yayılan arayüz aileleri. OOP'yi felsefi olarak yetersiz buluyorum. Her şeyin bir nesne olduğunu iddia eder. Doğru olsa bile çok ilginç değil - her şeyin bir nesne olduğunu söylemek hiçbir şey söylememektir.

Paul Graham , OOP'nin büyük şirketlerdeki popülaritesinin "büyük (ve sık sık değişen) vasat programcı grupları" nedeniyle olduğunu öne sürdü. Graham'a göre, OOP tarafından uygulanan disiplin, herhangi bir programcının "çok fazla zarar vermesini" engelliyor.

Leo Brodie, nesnelerin bağımsız doğası ile yazılım geliştirmenin kendinizi tekrar etmeyin ilkesini ihlal ederek kodu çoğaltma eğilimi arasında bir bağlantı önerdi .

Steve Yegge , işlevsel programlamanın aksine şunları kaydetti :

Nesneye Yönelik Programlama, İsimleri her şeyden önce koyar. Konuşmanın bir bölümünü bir kaide üzerine koymak için neden bu kadar ileri gittin? Neden bir tür kavram diğerine göre öncelikli olsun ki? OOP fiilleri aniden düşündüğümüz şekilde daha az önemli hale getirmiş gibi değil. Garip bir şekilde çarpık bir bakış açısı.

Zengin Hickey , yaratıcısı Clojure , gerçek dünyanın aşırı basit model olarak nesne sistemlerini tanımladı. Yazılım sistemleri daha eşzamanlı hale geldikçe giderek daha sorunlu hale gelen OOP'nin zamanı düzgün bir şekilde modelleyemediğini vurguladı.

Bir Unix programcısı ve açık kaynaklı yazılım savunucusu olan Eric S. Raymond , nesne yönelimli programlamayı "Tek Gerçek Çözüm" olarak sunan iddiaları eleştirdi ve nesne yönelimli programlama dillerinin, bu tür çok katmanlı programları teşvik etme eğiliminde olduğunu yazdı. şeffaflığı yok edin. Raymond, bunu Unix ve C programlama dili ile alınan yaklaşımla olumsuz bir şekilde karşılaştırır .

Rob Pike , yaratılması katılan bir programcı UTF-8 ve Go , nesne yönelimli programlama "çağrısı yaptı Romen rakamları hesaplama" ve cepten dilleri sıkça odak kayması söyledi veri yapıları ve algoritmalar için türleri . Ayrıca, bir soruna "deyimsel" çözümü yalnızca bir arama tablosu kullanmak yerine altı yeni sınıf oluşturmak olan bir Java profesörü örneğinden alıntı yapıyor .

biçimsel anlambilim

Nesneler, nesne yönelimli bir sistemdeki çalışma zamanı varlıklarıdır. Bir kişiyi, bir yeri, bir banka hesabını, bir veri tablosunu veya programın işlemesi gereken herhangi bir öğeyi temsil edebilirler.

Nesne yönelimli programlamada kullanılan kavramları resmileştirmek için birkaç girişimde bulunulmuştur. Aşağıdaki kavramlar ve yapılar, OOP kavramlarının yorumlanması olarak kullanılmıştır:

Nesnelerin arkasında bir fikir birliği tanımı veya teorisi bulma girişimlerinin çok başarılı olmadığı kanıtlanmıştır (ancak, birçok OOP kavramının ve yapısının resmi tanımları için Abadi & Cardelli, A Theory of Objects'e bakınız ) ve çoğu zaman büyük ölçüde birbirinden ayrılır. Örneğin, bazı tanımlar zihinsel faaliyetlere odaklanırken, bazıları program yapılandırmasına odaklanır. Daha basit tanımlardan biri, OOP'nin, tümü üstte bir miktar sözdizimsel ve kapsam belirleme şekeri olan , diğer haritalara yönelik işlevler ve işaretçiler içerebilen "harita" veri yapılarını veya dizilerini kullanma eylemi olmasıdır . Kalıtım, haritaları klonlayarak gerçekleştirilebilir (bazen "prototipleme" olarak adlandırılır).

Ayrıca bakınız

Sistemler

Modelleme dilleri

Referanslar

daha fazla okuma

Dış bağlantılar