• Örneklerle OOP nedir? Aptallar için. Video Kursu: Nesne Yönelimli Programlamanın Temelleri

    Programlama Paradigmaları

    Nesne yönelimli programlama (OOP)- bir programı, her biri belirli bir sınıfın örneği olan bir dizi nesne olarak temsil etmeye dayalı bir programlama metodolojisi ve sınıflar bir kalıtım hiyerarşisi oluşturur.

    Bu tanımın aşağıdaki önemli kısımlarına dikkat çekilmektedir: 1) nesne yönelimli programlama, temel mantıksal yapılar olarak algoritmalar yerine nesneleri kullanır; 2) her nesne belirli bir sınıfın örneğidir; 3) sınıflar hiyerarşiler oluşturur. Bir program, yalnızca bu gereksinimlerin üçü de karşılanırsa nesne yönelimli olarak kabul edilir. Özellikle kalıtım kullanmayan programlamaya nesne yönelimli programlama değil, soyut veri türleriyle programlama denir.

    Ansiklopedik YouTube

      1 / 5

      ✪ 2019'da Nesne Yönelimli Programlama

      ✪ Nesne Yönelimli Tasarım, 1. Bölüm - Sınıflar Nasıl Tasarlanır?

      ✪ Nesne yönelimli programlamanın temel ilkeleri. OOP nedir ve neden gereklidir?

      ✪ C++'da OOP'nin Temelleri

      ✪ Nesne yönelimli programlama. Sınıflar ve nesneler. Ders 3

      altyazılar

    Temel konseptler

    Veri soyutlama Soyutlama, anlamlı bilgilerin vurgulanması ve ilgisiz bilgilerin değerlendirme dışı bırakılması anlamına gelir. OOP, yalnızca programın geri kalanı tarafından kullanılabilen bir nesnenin bir dizi anlamlı özelliğini ima eden veri soyutlamayı (genellikle basitçe "soyutlama" olarak anılır) dikkate alır. Kapsülleme Kapsülleme, verileri ve onlarla birlikte çalışan yöntemleri bir sınıfta birleştirmenize izin veren bir sistem özelliğidir. Bazı diller (C++, Java veya Ruby gibi) kapsüllemeyi gizleme ile eşit tutarken, diğerleri (Smalltalk, Eiffel, OCaml) bu kavramları birbirinden ayırır. Kalıtım Kalıtım, kısmen veya tamamen ödünç alınmış işlevselliğe sahip mevcut bir sınıfı temel alan yeni bir sınıfı tanımlamanıza izin veren bir sistem özelliğidir. Miras aldığınız sınıfa temel, üst veya üst sınıf denir. Yeni sınıf, soyundan gelen, ardıl, alt veya türetilmiş bir sınıftır. Alt tip polimorfizmi Alt tip polimorfizmi (OOP'de kısaca "polimorfizm" olarak adlandırılır), aynı arayüze sahip nesnelerin, nesnenin türü ve iç yapısı hakkında bilgi olmadan kullanılmasına izin veren bir sistem özelliğidir. OOP'deki başka bir polimorfizm - parametrik - genelleştirilmiş programlama olarak adlandırılır. A Sınıfı sınıfı, tematik olarak birleştirilmiş bir "alanlar" (daha temel türlerdeki değişkenler) ve "yöntemler" (bu alanlarla çalışma işlevleri) kümesinden oluşan evrensel, karmaşık bir veri türüdür, yani bir bilgi varlık modelidir. içeriğini (alan değerleri) çalıştırmak için dahili ve harici arabirimlerle. Özellikle, alana doğrudan erişimi taklit eden belirli bir alanla (değer atama ve okuma arabirimi) temel işlemlerden sorumlu olan sınıflarda bir veya daha fazla sıklıkla iki eşleştirilmiş yöntemin özel blokları yaygın olarak kullanılır. Bu bloklara "özellikler" adı verilir ve alan adlarıyla neredeyse aynıdır (örneğin, bir alan adı küçük harfle başlayabilir ve bir özellik adı şu şekilde başlayabilir: büyük harf). Bir sınıfın arabirim doğasının başka bir tezahürü, karşılık gelen değişkeni atama yoluyla kopyalarken, yalnızca arabirimin kopyalanması, ancak verilerin kendisinin kopyalanmamasıdır, yani sınıf bir referans veri türüdür. Belirli bir sınıf tipindeki bir nesne değişkeni, o sınıfın bir örneği olarak adlandırılır. Aynı zamanda, bazı yürütme sistemlerinde, bir sınıf, dinamik veri türü tanımlaması yoluyla programın yürütülmesi sırasında bazı nesneler tarafından da temsil edilebilir. Tipik olarak sınıflar, nesnenin verilerinin bütünlüğünü ve ayrıca nesnenin doğasına ve çözülmekte olan göreve uygun, kullanışlı ve basit bir arabirim sağlayacak şekilde tasarlanır. Buna karşılık, nesnelerin konu alanlarının ve arayüzlerinin bütünlüğü ve tasarımlarının rahatlığı kalıtımla sağlanır. Nesne Bir sınıfın örneği oluşturulduğunda (örneğin, derleme sonuçlarını çalıştırdıktan ve yürütme için kaynak kodunu bağladıktan sonra) görünen, bilgi işlem sisteminin adres alanındaki bir varlık.

    OOP alt tiplerinin sınıflandırılması

    Luca Cardelli ve Martin Abadi, OOP için teorik bir mantık ve bu mantığa dayalı bir sınıflandırma oluşturdu. Tanımladıkları kavram ve kategorilerin tüm OO dillerinde bir arada bulunmadığını, çoğu dilin teorinin yalnızca alt kümelerini desteklediğini ve bazen ondan tuhaf sapmalar olduğunu belirtiyorlar.

    Farklı türlerdeki diller arasında kalite göstergelerinin tezahüründe en belirgin farklar:

    • Ana akım dillerde, beyan edilen ilkeler, zorunlu programlama için doğası gereği düşük olan kodun yeniden kullanım oranını artırmayı amaçlar. Polimorfik tipte, OOP kavramlarının uygulanması, bunun tersine, parametrik polimorfizmden ad hoc polimorfizme geçiş nedeniyle bariz bir şekilde azalması anlamına gelir. Dinamik olarak yazılan dillerde (Smalltalk, Python, Ruby), bu ilkeler bir programı mantıksal olarak düzenlemek için kullanılır ve yeniden kullanım oranları üzerindeki etkilerini tahmin etmek zordur - büyük ölçüde programcının disiplinine bağlıdır. Örneğin, CLOS'ta, çoklu yöntemler aynı anda birinci sınıfın fonksiyonlarıdır, bu da onları aynı anda ve aynı anda ele almamıza izin verir. ilgili sayısallaştırılmış ve genelleştirilmiş (gerçek polimorfik).
    • Geleneksel OO dillerinin kullanımı aday yazarak, yani, yalnızca sınıflar arasındaki ilişki açıkça belirtilmişse, farklı sınıflara ait nesnelerin birlikte kullanımının kabul edilebilirliği. Polimorfik olarak yazılan diller ile karakterize edilir yapısal yazım, yani, 5 sayısını int türüyle eşleştirmeyle aynı mekanizma ile sınıfların kendi aralarında eşleştirilmesi. Dinamik olarak yazılan diller de burada ara bir konuma sahiptir.

    genelleştirilmiş gerekçe dinamik zamanlama(çoğul dahil) 1990'ların ortalarında Giuseppe Castagna tarafından yaptırılmıştır.

    Hikaye

    OOP, verilerin işlenmesi için alt programların (prosedürler, işlevler) resmi olarak ilişkili olmadığı prosedürel programlama ideolojisinin gelişiminin bir sonucu olarak ortaya çıktı. İçin Daha fazla gelişme nesne yönelimli programlama genellikle büyük önem olay (olay yönelimli programlama) ve bileşen (bileşen programlama, COP) kavramlarına sahiptir.

    Nesneler aracılığıyla etkileşime girer. OOP'nin daha da geliştirilmesinin sonucu, görünüşe göre, aracı yönelimli programlama olacaktır; burada ajanlar- çalışma düzeyinde kodun bağımsız bölümleri. Ajanlar değiştirerek etkileşime girer ortamlar bulundukları yer.

    Yapısal olarak nesnelerle doğrudan ilişkili olmayan, ancak güvenli (istisnai durumlar, kontroller) ve verimli çalışma için onlara eşlik eden dil yapıları, onlardan açılara (boy-yönelimli programlamada) kapsüllenir. Nesne yönelimli programlama, nesnelerin daha birleşik ve bağımsız etkileşimini sağlayarak nesne kavramını genişletir. Bağımsız etkileşimleri açısından OOP ve aracı programlama arasında bir geçiş aşaması olabilir.

    Daha sonra bir paradigmaya dönüşen temel kavramları öneren ilk programlama dili Simula idi, ancak bu dilin kullanımı bağlamında "nesne yönelimli" terimi kullanılmadı. 1967'de ortaya çıktığı sırada, içinde devrimci fikirler önerildi: nesneler, sınıflar, sanal yöntemler vb. Ancak tüm bunlar çağdaşlar tarafından görkemli bir şey olarak algılanmadı. Aslında Simula, birçok karmaşık kavramın prosedürel programlamada ifade edilmesini kolaylaştıran bir "sınıflı Algol" idi. Simula'da bir sınıf kavramı, Algol yapılarının bileşimi yoluyla tam olarak tanımlanabilir (yani, Simula'da bir sınıf, ilkellerle açıklanan karmaşık bir şeydir).

    Smalltalk dilinde Alan Kay ve Dan Ingalls tarafından programlamaya "yeni bir açı" (usul dışında) bir bakış sunuldu. Burada bir sınıf kavramı, diğer tüm dil yapıları için temel fikir haline gelmiştir (yani, Smalltalk'ta bir sınıf, daha karmaşık yapıların tanımlandığı bir ilkeldir). İlk yaygın nesne yönelimli programlama dili olan oydu.

    Şu anda, nesne yönelimli paradigmayı uygulayan uygulamalı programlama dillerinin (list dilleri) sayısı, diğer paradigmalara göre en fazladır. Sektördeki en yaygın diller (C++, Delphi, C#, Java vb.) Simula nesne modelini uygular. Smoltok modeline dayalı dil örnekleri Objective-C, Python, Ruby'dir.

    OOP'nin tanımı ve ana kavramları

    OOP'nin merkezinde kavram var nesne. Bir nesne, mesajların gönderilebildiği ve verilerini kullanarak onlara yanıt verebilen bir varlıktır. Bir nesne, bir sınıfın örneğidir. Nesnenin verileri programın geri kalanından gizlenir. Verileri gizlemeye kapsülleme denir.

    Kapsüllemenin varlığı, bir programlama dilinin nesnelliği için yeterlidir, ancak henüz nesne yönelimi anlamına gelmez - bu, kalıtımın varlığını gerektirir.

    Ancak kapsülleme ve kalıtımın varlığı bile programlama dilini OOP açısından tamamen nesne yönelimli yapmaz. OOP'nin ana avantajları, yalnızca programlama dili alt tip polimorfizmi uyguladığında ortaya çıkar - ortak bir arayüz olması koşuluyla, farklı uygulamalara sahip nesneleri tek tip bir şekilde ele alma yeteneği.

    Tanımlama zorlukları

    OOP'nin kırk yıldan fazla bir geçmişi vardır, ancak buna rağmen, bu teknolojinin hala net, genel kabul görmüş bir tanımı yoktur. İlk nesne dillerinde ve sistemlerinde ortaya konan temel ilkeler, müteakip sayısız uygulama ile önemli bir değişikliğe (veya bozulmaya) ve eklemeye uğramıştır. Ek olarak, yaklaşık 1980'lerin ortalarından beri, "nesne yönelimli" terimi moda oldu ve sonuç olarak, biraz daha önce "yapısal" terimiyle aynı şey oldu (yapısalın yayılmasından sonra moda oldu). programlama teknolojisi) - onları çekici kılmak için herhangi bir yeni gelişmeye yapay olarak " iliştirildi". Björn Stroustrup 1988'de bir şeyin "nesne yönelimi" gerekçesinin çoğu durumda yanlış bir kıyasa vardığını yazmıştı: "X iyidir. Nesne yönelimi iyidir. Buradan, X nesne yönelimlidir."

    Roger King, kedisinin nesne yönelimli olduğunu savundu. Kedi, diğer erdemlerinin yanı sıra karakteristik davranış sergiler, mesajlara yanıt verir, kalıtsal tepkilere sahiptir ve tamamen bağımsız, kendi iç durumunu kontrol eder.

    Bununla birlikte, mesajlaşma mekanizmasının genelliğinin başka bir yanı vardır - "tam teşekküllü" mesaj iletimi, her zaman kabul edilebilir olmayan ek yük gerektirir. Bu nedenle, birçok modern nesne yönelimli programlama dili kavramını kullanır. "yöntem çağrısı olarak mesaj gönderme"- nesnelerin, nesnelerin etkileşiminin sağlandığı çağrılarla dışarıdan erişilebilen yöntemleri vardır. Bu yaklaşım, C++ , Object Pascal , Java , Oberon-2 dahil olmak üzere çok sayıda programlama dilinde uygulanmıştır. Bununla birlikte, bu, mesajların artık bağımsız nesneler olmadığı ve sonuç olarak, programlama olanaklarını daraltan niteliklere sahip olmadığı gerçeğine yol açar. Bazı diller, her iki yaklaşımın avantajlarını aynı anda gösteren karma bir temsil kullanır - örneğin, CLOS , Python .

    Konsept sanal yöntemler, bu ve diğer modern diller tarafından desteklenen, polimorfik değişkenler kullanılırken istenen yöntemlerin yürütülmesini sağlamak için bir araç olarak, yani özünde, sağlanan işlevselliğin bir kısmını uygulamak için yöntemleri çağırma yeteneğini genişletme girişimi olarak ortaya çıktı. mesaj işleme mekanizması

    Uygulama özellikleri

    Yukarıda bahsedildiği gibi, modern nesne yönelimli programlama dillerinde her nesne, belirli bir sınıfa ait bir değerdir. Bir sınıf, programcı tarafından bildirilen ve şunları içeren bileşik bir veri türüdür:

    Veri alanları Bir nesnenin durumunu (konu alanı nesnesinin özellikleri) tanımlayan parametreleri (elbette hepsi değil, ancak yalnızca programda gereklidir). Bazen bir nesnenin veri alanları, kafa karıştırıcı olabilen, nesnenin özellikleri olarak anılır. Fiziksel olarak alanlar, sınıfa ait olduğu beyan edilen değerlerdir (değişkenler, sabitler). Yöntemler Bir sınıfla ilişkili yordamlar ve işlevler. O türdeki bir nesne üzerinde gerçekleştirilebilecek ve nesnenin kendisinin gerçekleştirebileceği eylemleri tanımlarlar.

    Sınıflar birbirinden miras alabilir. Alt sınıf, üst sınıfın tüm alanlarını ve yöntemlerini alır, ancak bunları kendisininkiyle tamamlayabilir veya mevcut olanları geçersiz kılabilir. Çoğu programlama dili yalnızca tek kalıtımı destekler (bir sınıfın yalnızca bir üst sınıfı olabilir), yalnızca birkaçı çoklu kalıtıma izin verir - iki veya daha fazla üst sınıftan bir sınıfın oluşturulması. Çoklu kalıtım, hem mantıksal hem de tamamen uygulamasal bir dizi sorun yaratır, bu nedenle tam desteği yaygın değildir. Bunun yerine, 1990'larda arayüz kavramı ortaya çıktı ve nesne yönelimli dillere aktif olarak tanıtılmaya başlandı. Bir arabirim, yalnızca yöntem başlıkları dahil olmak üzere hiçbir alanı ve uygulaması olmayan bir sınıftır. Bir sınıf bir arabirimi devralırsa (veya uyguladığı söylenirse), tüm üye yöntemlerini uygulaması gerekir. Arabirimleri kullanmak, çoklu kalıtıma nispeten ucuz bir alternatif sağlar.

    Nesnelerin etkileşimi, çoğu durumda birbirlerinin metotlarının çağrılması ile sağlanır.

    Kapsülleme aşağıdaki yollarla sağlanır:

    Erişim kontrolü Sınıf yöntemleri, hem nesnenin işleyişinin mantığını sağlayan tamamen dahili hem de hangi nesnelerin etkileşime girdiğinin yardımıyla harici olabileceğinden, birincisinin gizli, ikincisine dışarıdan erişilebilir olmasını sağlamak gerekir. Bunu yapmak için, her sınıf üyesinin kapsamını açıkça belirleyen dillere özel sözdizimsel yapılar tanıtılır. Geleneksel olarak, bunlar genel, korumalı ve özel değiştiricilerdir, sırasıyla sınıfın genel üyelerini, sınıf içinde ve alt sınıflardan erişilebilen sınıf üyelerini ve yalnızca sınıf içinde erişilebilen gizlileri ifade eder. Değiştiricilerin özel terminolojisi ve kesin anlamları arasında farklılık vardır. farklı diller. Erişim Yöntemleri Bir sınıfın alanlarına genellikle dışarıdan erişilemez, çünkü böyle bir erişim nesnelerin iç durumlarının keyfi olarak değiştirilmesine izin verir. Bu nedenle, alanlar genellikle gizli olarak bildirilir (veya dil ilke olarak sınıfın alanlarına dışarıdan erişime izin vermez) ve alanlardaki verilere erişmek için erişimci adı verilen özel yöntemler kullanılır. Bu tür yöntemler ya belirli bir alanın değerini döndürür ya da bu alana yeni bir değer yazar. Yazarken, erişimci yazılan değerin geçerli olup olmadığını kontrol edebilir ve gerekirse doğru kalması (dahili olarak tutarlı) için nesnenin verileri üzerinde başka manipülasyonlar gerçekleştirebilir. Erişim yöntemlerine ayrıca erişimciler (İngilizce erişimden - erişim) ve ayrı ayrı - alıcılar (İngilizce alma - okuma) ve ayarlayıcılar (İngilizce set - yazma) denir. Sözde alan nesnesinin özellikleri , okuma ve/veya yazma için kullanılabilir. Özellikler alanlar gibi görünür ve erişilebilir alanlarla aynı şekilde kullanılır (bazı istisnalar dışında), ancak aslında bunlara erişildiğinde erişimci yöntemleri çağrılır. Bu nedenle, özellikler, bazı ek eylemlerle nesnenin dahili verilerine erişime eşlik eden "akıllı" veri alanları olarak kabul edilebilir (örneğin, nesnenin koordinatını değiştirirken, yeni bir yerde yeniden çizilmesi eşlik eder). Mülkler, aslında, başka bir şey değildir. Sözdizimsel şeker, çünkü herhangi bir yeni özellik eklemezler, ancak yalnızca erişimci yöntemlerine yapılan çağrıyı gizlerler. Özelliklerin özel dil uygulaması değişebilir. Örneğin, bir özellik bildirimi, yalnızca özelliklerle çalışırken çağrılan erişimci yöntemleri için doğrudan kod içerir, yani anında çağrı için kullanılabilen ayrı erişimci yöntemleri gerektirmez. Delphi'de bir özellik bildirimi, yalnızca alana erişildiğinde çağrılması gereken erişimci yöntemlerin adlarını içerir. Erişimcilerin kendileri, bazı ek imza gereksinimleri olan sıradan yöntemlerdir.

    Polimorfizm, "sınıf" türünden bir değişkene kendi sınıfının herhangi bir soyundan gelen sınıfın bir nesnesinin atanabileceği kuralların dile getirilmesiyle gerçekleştirilir.

    Genel olarak program tasarımı

    OOP, bir programcı ekibi (belki oldukça büyük) tarafından geliştirilen büyük yazılım sistemlerinin geliştirilmesine odaklanmıştır. Sistemin bir bütün olarak tasarımı, bireysel bileşenlerin oluşturulması ve bunların nihai ürüne entegrasyonu genellikle farklı kişiler tarafından gerçekleştirilir ve proje hakkında her şeyi bilecek tek bir uzman yoktur.

    Nesne yönelimli tasarım, tasarlanmakta olan sistemin yapısının açıklamasına odaklanır (işlevsel programlamanın aksine davranışının açıklamasına öncelik verir), yani aslında iki ana soruya yanıt olarak:

    • Sistem hangi parçalardan oluşuyor?;
    • Her bir parçasının sorumluluğu nedir?.

    Parçaların tahsisi, her birinin yerine getirilen asgari ve kesin olarak tanımlanmış bir dizi işleve (görevlere) sahip olacak ve aynı zamanda diğer parçalarla mümkün olduğunca az etkileşime girecek şekilde gerçekleştirilir.

    Daha fazla iyileştirme, açıklamanın daha küçük parçalarının seçilmesine yol açar. Açıklama detaylandırıldıkça ve sorumluluk belirlendikçe saklanması gereken veriler, ortak atalara sahip sınıflar şeklinde uygulanmaya aday hale gelen benzer etmenlerin davranıştaki varlığı ortaya çıkar. Bileşenlerin seçiminden ve aralarındaki arayüzlerin tanımlanmasından sonra, her bileşenin uygulanması diğerlerinden neredeyse bağımsız olarak gerçekleştirilebilir (elbette uygun teknolojik disipline tabi olarak).

    Sınıf hiyerarşisinin doğru inşası büyük önem taşır. OOP teknolojisi kullanılarak inşa edilen büyük sistemlerin iyi bilinen sorunlarından biri sözde temel sınıf kırılganlık sorunu. Geliştirmenin sonraki aşamalarında, sınıf hiyerarşisi oluşturulduğunda ve temel olarak büyük miktarda kod geliştirildiğinde, kodunda herhangi bir değişiklik yapmanın zor, hatta imkansız olduğu gerçeğinden oluşur. hiyerarşinin temel sınıfları (sistemde çalışan tüm veya birçok sınıfın oluşturulduğu). Yaptığınız değişiklikler temel sınıfın arabirimini etkilemese bile davranışını değiştirmek, alt sınıfları öngörülemeyen bir şekilde etkileyebilir. Ne zaman ana sistem temel sınıfın geliştiricisi, değişikliklerin sonuçlarını tahmin edemez, temel sınıfın nasıl kullanıldığını ve soyundan gelen sınıfların doğru çalışmasının davranışının hangi özelliklerine bağlı olduğunu bile bilmez.

    Çeşitli OOP Metodolojileri

    Bileşen programlama, OOP'nin geliştirilmesindeki bir sonraki aşamadır; prototip ve sınıf odaklı programlama, kendi avantaj ve dezavantajlarına sahip, birleştirilebilen bir program oluşturmaya yönelik farklı yaklaşımlardır.

    Bileşen Programlama

    Bileşen yönelimli programlama, OOP üzerinde bir tür "üstyapı", büyük yazılım geliştirme sistemleri oluşturmayı amaçlayan bir dizi kural ve kısıtlamadır. büyük zaman hayat. Bu metodolojideki yazılım sistemi, iyi tanımlanmış arayüzlere sahip bir dizi bileşendir. Değişiklikler mevcut sistemönceden var olanlara ek olarak veya bunların yerine yeni bileşenler oluşturularak tanıtılır. Daha önce oluşturulmuş olanlara dayalı olarak yeni bileşenler oluştururken, uygulama mirasının kullanılması yasaktır - yeni bileşen arabirimleri yalnızca tabandan devralabilir. Bu şekilde bileşen programlama, temel sınıfın kırılganlık sorununu atlar.

    Prototip programlama

    Prototip programlama, OOP'nin bazı özelliklerini korurken, sınıf ve kalıtım gibi temel kavramları terk etti.

    • Bir prototip, başka nesnelerin yaratıldığı görüntü ve benzerliğinde bir nesne örneğidir. Kopyalama nesneleri, prototipteki değişiklikleri otomatik olarak devralarak üst nesneyle olan ilişkilerini koruyabilir; bu özellik belirli bir dil içinde tanımlanır.
    • Dil, sınıfları tanımlamak ve örnekler oluşturmak için bir mekanizma yerine, bir nesne yaratmak için bir mekanizma (bir nesnenin sahip olması gereken bir dizi alan ve yöntem belirleyerek) ve nesneleri klonlamak için bir mekanizma sağlar.
    • Yeni oluşturulan her nesne, "sınıfsız bir örnektir". Her nesne olabilir prototip- bir işlemle yeni bir nesne oluşturmak için kullanılabilir klonlama. Klonlamadan sonra yeni nesne değiştirilebilir, özellikle yeni alanlar ve yöntemlerle eklenebilir.
    • Klonlanmış bir nesne ya prototipin tam bir kopyası haline gelir, tüm alan değerlerini depolar ve yöntemlerini çoğaltır ya da klonlanan alanları ve yöntemleri değiştirilene kadar dahil etmeden prototipe bir referans tutar. İkinci durumda, çalışma zamanı bir mekanizma sağlar delegasyon- bir nesneye erişirken, gerekli yöntemi veya veri alanını içermiyorsa, çağrı prototipe, gerekirse ondan zincirin daha aşağısına iletilir.

    Sınıf Odaklı Programlama

    Sınıf odaklı programlama, veri ve davranışın ayrılmaz bir şekilde bağlantılı olduğu veri odaklı programlamadır. Veri ve davranış birlikte bir sınıf oluşturur. Buna göre, "sınıf" kavramına dayalı dillerde, tüm nesneler iki ana türe ayrılır - sınıflar ve örnekler. Bir sınıf, o sınıfın tüm örnekleri için aynı olan bir yapı ve işlevsellik (davranış) tanımlar. Bir örnek bir veri taşıyıcısıdır - yani sınıf tarafından belirtilen davranışa göre değişen bir duruma sahiptir. Sınıf yönelimli dillerde, sınıf yapıcısı çağrılarak (belki bir dizi parametreyle) yeni bir örnek oluşturulur. Ortaya çıkan örnek, sınıfı tarafından kodlanmış yapıya ve davranışa sahiptir.

    Nesne programlarının performansı

    Gradi Buch, nesne yönelimli araçların kullanımı nedeniyle program performansında düşüşe yol açan aşağıdaki nedenlere dikkat çekiyor:

    Dinamik yöntem bağlama Nesnelerin polimorfik davranışını sağlamak, program tarafından çağrılan yöntemleri bağlama (yani, hangi özel yöntemin çağrılacağını belirlemek için) derleme aşamasında değil, ek zaman alan program yürütme sırasında bağlanma ihtiyacına yol açar. Aynı zamanda, dinamik bağlama aslında aramaların en fazla %20'si için gereklidir, ancak bazı OOP dilleri bunu her zaman kullanır. Önemli soyutlama derinliği OOP gelişimi genellikle, bir nesne tarafından gerekli eylemin yürütülmesinin daha düşük seviyedeki nesnelere yapılan birçok çağrıya indirgendiği "katmanlı" uygulamaların oluşturulmasına yol açar. Böyle bir uygulamada, elbette performansı etkileyen birçok yöntem çağrısı ve yöntem dönüşü vardır. Kalıtım, kodu "bulanıklaştırır" Kalıtım hiyerarşisinin genellikle doğrudan program tarafından kullanılan "son" sınıflarıyla ilgili kod, yalnızca bu sınıfların kendisinde değil, aynı zamanda ata sınıflarında da bulunur. Aynı sınıfa ait metotlar aslında farklı sınıflarda tanımlanır. Bu, can sıkıcı iki şeye yol açar:

    • Bağlayıcının hiyerarşinin tüm sınıflarının açıklamalarını yüklemesi gerektiğinden çeviri hızı azalır.
    • Programın sayfa belleği olan bir sistemdeki performansı düşer - çünkü bir sınıfın yöntemleri fiziksel olarak farklı yerler kod, birbirinden uzakta, kalıtsal yöntemlere aktif olarak erişen program parçalarını çalıştırırken, sistem sık sık sayfa değiştirme yapmaya zorlanır.
    Kapsülleme, veri erişim hızını azaltır Sınıf alanlarına dışarıdan doğrudan erişimin yasaklanması, erişim yöntemleri oluşturma ve kullanma ihtiyacına yol açar. Ve erişim yöntemlerinin yazılması, derlenmesi ve yürütülmesi ek maliyetlerle ilişkilidir. Nesnelerin dinamik olarak oluşturulması ve yok edilmesi Dinamik olarak oluşturulan nesneler genellikle öbek üzerinde tahsis edilir; bu, onları yığına yerleştirmekten ve ayrıca derleme zamanında bunlar için statik olarak bellek ayırmaktan daha az verimlidir.

    Bu eksikliklere rağmen Booch, OOP kullanmanın faydalarının daha fazla olduğunu savunuyor. Ek olarak, OOP kodunun daha iyi düzenlenmesinden elde edilen performans kazanımlarının, bazı durumlarda programı çalıştırmanın ek yükünü dengelediğini söylüyor. Ayrıca, derleyici tarafından yapılan yüksek kaliteli kod optimizasyonu nedeniyle birçok performans düşüşü etkisinin düzeltilebileceğini ve hatta tamamen ortadan kaldırılabileceğini fark edebilirsiniz. Örneğin, erişimcilerin kullanımı nedeniyle sınıf alanlarına erişim hızındaki yukarıda belirtilen düşüş, derleyici erişimciyi çağırmak yerine satır içi ikame kullanırsa ortadan kaldırılır (modern derleyiciler bunu oldukça güvenli bir şekilde yapar).

    OOP Eleştirisi

    OOP'ye yönelik bazı eleştirilere rağmen, bu paradigma şu anda endüstriyel projelerin büyük çoğunluğunda kullanılmaktadır. Ancak, OOP'nin her durumda en iyi programlama tekniği olduğu varsayılamaz.

    FKÖ'ye yönelik eleştiriler:

    • Geliştirme verimliliğinde önemli bir fark gösterilmemiştir yazılım OOP ve prosedürel yaklaşım arasında.
    • Christopher Date, büyük ölçüde kesin ve genel kabul görmüş bir OOP tanımının olmaması nedeniyle, OOP'yi diğer teknolojilerle karşılaştırmanın imkansız olduğuna işaret ediyor.
    • Alexander Stepanov, röportajlarından birinde OOP'nin "metodolojik olarak yanlış" olduğunu ve "... OOP'nin pratikte yapay zeka ile aynı aldatmaca olduğunu ..." belirtti.
    • Frederick Brooks, yazılım geliştirmenin en zor kısmının “…kavramsal yapıları ifade etme işi değil, kavramsal yapıların belirtimi, tasarımı ve test edilmesi…” olduğuna işaret ediyor. OOP (yapay zeka, program doğrulama, otomatik programlama, grafik programlama, uzman sistemler vb. teknolojilerle birlikte), ona göre, yazılım sistemlerinin geliştirilmesinin karmaşıklığını bir sıra ile azaltabilecek bir "sihirli değnek" değildir. büyüklük. Brooks'a göre, “…OOP yalnızca tasarım ifadesine eklenen karmaşıklığı azaltır. Tasarım doğası gereği karmaşık olmaya devam ediyor…” .
    • Edsger Dijkstra şuna dikkat çekti: “...toplumun çoğu durumda istediği şey, tüm hastalıklar için bir iksirdir. Doğal olarak "iksir"in çok etkileyici isimleri var, yoksa bir şeyi satmak çok zor olur: "Yapısal Analiz ve Tasarım", "Yazılım Mühendisliği", "Olgunluk Modelleri", "Yönetim Bilişim Sistemleri", "Bütünleşik Ortamlar" proje desteği ”, “Nesne Oryantasyonu”, “Yeniden Yapılanma İş Süreçleri”…” .
    • Niklaus Wirth, OOP'nin yapılandırılmış programlama üzerinde önemsiz bir üst yapıdan başka bir şey olmadığına inanıyor ve diğer şeylerin yanı sıra, programlama dillerine her zaman yeni moda "nesne yönelimli" araçların dahil edilmesinde ifade edilen öneminin abartılması, programlama dillerine zarar veriyor. Geliştirilen yazılımın kalitesi.
    • Patrick Killelia, Tuning the Web Server adlı kitabında şunları yazdı: "... OOP, programlarınızı yavaşlatmanız için size birçok yol sunar ...".
    • Modern OOP programlamanın sorunları hakkında iyi bilinen bir genel bakış makalesi, bazılarını listeler. tipik problemler Oop [ ] .
    • Programlama folklorunda, "metaforunu kullanan işlevsel yaklaşımla karşılaştırıldığında nesne yönelimli yaklaşıma yönelik yaygın eleştiriler olmuştur. Krallıklar Steve Yeggi'nin bir makalesinden.

    OOP eleştirilerini sınıflandırmaya çalışırsak, programlamaya yönelik bu yaklaşımın eleştirisinin birkaç yönünü vurgulayabiliriz.

    OOP reklamcılığının eleştirisi Eleştiri, bazı OOP propagandacılarının çalışmalarında ve ayrıca "nesne yönelimli" geliştirme araçları için promosyon malzemelerinde, programlamanın karmaşıklığını sihirli bir şekilde ortadan kaldıran bir tür her şeye gücü yeten yaklaşım olarak nesne programlama kavramında ifade edilir veya ima edilir. . Yukarıda belirtilen Brooks ve Dijkstra da dahil olmak üzere birçok kişinin belirttiği gibi, "sihirli değnek yoktur" - geliştirici hangi programlama paradigmasına bağlı kalırsa kalsın, önemsiz olmayan bir kompleks oluşturur yazılım sistemi her zaman entelektüel kaynakların ve zamanın önemli maliyetleriyle ilişkilendirilir. OOP alanındaki en kalifiye uzmanlardan hiç kimse, kural olarak, bu tür bir eleştirinin geçerliliğini inkar etmez. OOP Geliştirmenin Verimliliğine Meydan Okumak Eleştirmenler, nesne yönelimli programlar geliştirmenin daha az kaynak gerektirdiği veya daha iyi yazılımla sonuçlandığı tezine meydan okuyor. Geliştirme maliyetlerinin karşılaştırılması farklı yöntemler, FKÖ'nün bu yönde hiçbir avantajı olmadığı sonucuna varıldı. Çeşitli gelişmelerin nesnel karşılaştırmasının aşırı karmaşıklığı göz önüne alındığında, bu tür karşılaştırmalar en azından tartışmalıdır. Öte yandan, OOP'nin etkinliğine ilişkin ifadelerin de bir o kadar tartışmalı olduğu ortaya çıktı. Nesne yönelimli programların performansı OOP teknolojisinin bir dizi "doğal özelliğinin", temel alınarak oluşturulan programları benzer nesne olmayan programlara kıyasla teknik olarak daha az verimli hale getirdiğine işaret edilmektedir. OOP programlarını çalıştırmak için gerçekten de ek yüklerin olduğunu inkar etmemekle birlikte (yukarıdaki "Performans" bölümüne bakın), performans düşüşü etkisinin eleştirmenler tarafından genellikle abartıldığına dikkat edilmelidir. İÇİNDE modern koşullar Bilgisayarların teknik yetenekleri son derece büyük olduğunda ve sürekli olarak büyüdüğünde, çoğu uygulama programı için teknik verimlilik, işlevsellik, geliştirme hızı ve sürdürülebilirlikten daha az önemlidir. Yalnızca çok sınırlı bir program sınıfı için (gömülü sistem yazılımı, aygıt sürücüleri, düşük seviyeli sistem yazılımı, bilimsel yazılım) performans kritik bir faktör olmaya devam ediyor. OOP dillerinde ve kitaplıklarında bireysel teknolojik çözümlerin eleştirisi Bu eleştiri çoktur, ancak OOP'yi bu şekilde etkilemez, ancak kabul edilebilirliği ve uygulanabilirliği etkiler. özel durumlar mekanizmalarının belirli uygulamaları. En sevilen eleştiri nesnelerinden biri, en yaygın endüstriyel OOP dillerinden biri olan C++ dilidir.

    Nesne Yönelimli Diller

    Birçok modern Diller nesne yönelimli programlamayı kolaylaştırmak için özel olarak tasarlanmıştır. Bununla birlikte, OOP tekniklerinin nesne yönelimli olmayan bir dile uygulanabileceği ve bunun tersi de unutulmamalıdır, nesne yönelimli bir dilin kullanılması, kodun otomatik olarak nesne yönelimli hale geldiği anlamına gelmez.

    Tipik olarak, nesne yönelimli bir dil (OOL) aşağıdaki öğe kümesini içerir:

    • Alanlarla (veriler - sınıfın üyeleri) ve yöntemlerle (işlevler - sınıfın üyeleri) sınıfları bildirmek.
    • Sınıf genişletme (miras) mekanizması - mevcut bir sınıftan yeni bir sınıf oluşturma otomatik açma ata sınıfının soyundan gelen sınıfa uygulanmasının tüm özellikleri. Çoğu CRL yalnızca tek devralmayı destekler.
    • Farklı sınıfların örneklerini aynı değişkene atamanıza izin veren polimorfik değişkenler ve işlev (yöntem) parametreleri.
    • Sanal yöntemlerin kullanımı yoluyla sınıf örneklerinin polimorfik davranışı. Bazı CRL'lerde, tüm sınıf yöntemleri sanaldır.

    Bazı diller, belirtilen minimum sete belirli ekler ek fonlar. Aralarında:

    • Yapıcılar, yıkıcılar, kesinleştiriciler;
    • Özellikler (erişimciler);
    • indeksleyiciler;
    • Sınıf bileşenlerinin (arayüzler veya genel, özel, korumalı, özellik vb. gibi erişim değiştiricileri) görünürlüğünü kontrol etmek için araçlar.

    Bazı diller, OOP ilkelerini sonuna kadar takip eder - içlerinde tüm ana öğeler, bir durumu ve ilişkili yöntemleri olan nesnelerdir. Benzer dillerin örnekleri Smalltalk, Eiffel'dir. Nesne alt sistemini bütünüyle diğer paradigmaların alt sistemleriyle "iki veya daha fazla dil bir arada" olarak birleştiren, tek bir programda birleştirmenize izin veren hibrit diller vardır. nesne modelleri ve OOP ile diğer paradigmalar arasında dengelenen standart olmayan özellikler nedeniyle (birden çok gönderme, parametrik sınıflar, sınıf yöntemlerini bağımsız nesneler olarak manipüle etme yeteneği vb.) nesne yönelimli ve diğer paradigmalar arasındaki çizgiyi bulanıklaştırır. Bu tür dillere örnekler:

    1 yıl önce | 13.4K

    Büyük bir şirkette programcı olarak pozisyon almak isteyen her aday, bu tür programlama nedir sorusuna cevap vermelidir. Programcı cevap vermekte güçlük çekiyorsa, çoğu durumda görüşmeci kibarca görüşmenin bittiğini bildirecektir. Bu segmente odaklanmadan programcıların normal bir iş bulması zordur.

    Bu soruya yeterli bir cevap vermek için, yalnızca OOP'nin temel özellikleri hakkında bilgi sahibi olmanız değil, aynı zamanda bazı kavramları da anlamanız gerekecek - örneğin, polimorfizm, ayrıca kapsülleme ve kalıtım. Modülden, OOP'nin teorik temeli ile tanışabilir ve MVC modülünde - tüm modülde pratikte bilgi uygulayabilirsiniz.

    OOP'ye Giriş

    OOP, programlamadaki modası geçmiş prosedürel yaklaşımın yerini alan çok popüler bir programlama paradigmasıdır. Prosedürel programlamanın OOP'den ne kadar farklı olduğunu anlamak için prosedürel programlamanın özelliklerini daha ayrıntılı olarak ele almaya değer.

    Dolayısıyla, programlamaya prosedürel yaklaşım kullanılarak yazılan bir program, programcının ihtiyaç duyduğu belirli sayıda talimatı ve alt programları içeren yekpare bir programdır.

    Bu programlama yöntemleri arasındaki farkları hemen anlamak için kodu birkaç şekilde değerlendirmeniz gerekir:

    Prosedürel programlama:

    $value = "Merhaba!"; echo $value; !}

    Hayır.

    sınıf İnsan ( özel $words; genel işlev setWords($words) ( $this->words = $words; ) genel işlev getWords() ( dönüş $this->words; ) genel işlev sayIt() ( $this-> döndürür) getWords(); ) ) $insan = yeni İnsan(); $human->setWords("Merhaba!"); echo $insan->sayIt();

    Görünür farkı hemen vurgulamaya değer - ilk versiyonda her şey çok daha basit, daha az kod. Birçok kişi OOP kodunu çok karmaşık bulacak ve ilk seçeneği seçecektir, ancak bu yalnızca ilk yanıltıcı izlenimdir.

    İÇİNDE bu durum Bir yaklaşım seçerken, alınan görevin özellikleri dikkate alınmalıdır. Prosedürel yaklaşım, kısa süreli kullanım için basit kod oluşturmak için idealdir - kod 5 satırdan fazla olmayacaksa bu yaklaşımı seçin.

    Daha karmaşık ve düzenli olarak yinelenen bir görev için, OOP'yi seçmek en iyisidir.

    SINIF nedir

    Burada her şey oldukça basit - bunlar yöntemler ve program alanlarıdır. Örnek olarak, İnsan'ı düşünün:

    Sınıf İnsan ( özel $words; genel işlev setWords($words) ( $this->words = $words; ) genel işlev getWords() ( $this->words; ) genel işlev sayIt() ( $this-> döndürür) getWords(); ) )

    Burada her şey çok basit, Human bir sınıf ismi, $words bir değişken (field) ve setWords, getWords(), sayIt() metodlardır.

    Bazı Temel OOP İlkeleri

    OOP'nin temelini oluşturan aynı anda 3 ana ilke vardır. OOP'nin tüm özelliklerini anlama fırsatınız olması için bu ilkelerin her biri daha ayrıntılı olarak tartışılacaktır.

    kapsülleme

    Sunulan ilkelerin her birini anlamanıza yardımcı olacak birkaç örnek göstereceğiz. Kapsülleme, bilgilerin harici kullanıcılardan korunmasının bir türüdür.

    Ne olduğunu hemen netleştirmek için gerçek bir örnek verelim.

    Telefonunuzu kullanarak belirli bir arama yapmak istiyorsunuz - bu, hücresel segment, kule yerleşimi vb. hakkında ek bilgiye sahip olmanızı gerektirmez. Daha basit bilgi sizin için yeterlidir - seçilen abonenin numarası ve planlanmış bir arama yapmanızı sağlayacak araçlar.

    Kapsülleme, harici kullanıcılara (programcılara) programınızla çalışmak için ihtiyaç duydukları yöntemlere erişim sağlarken, tüm önemli dahili yöntemlere erişilemez, harici kullanıcılar bunlara ihtiyaç duymaz.

    İşte bir kapsülleme örneği:

    İnsan Sınıfı ( private $words; private $sex; public function setSex($sex) ( if($sex == "male") ( $this->sex = "male"; ) else if($sex == "female ") ( $this->sex = $sex; ) else ( echo "Hata. Yalnızca erkek veya kadın cinsiyetini ayarlayın"; ) ) public function setWords($words) ( $this->words = $words; ) public function getWords () ( dönüş $this->words; ) genel işlev sayIt() ( dönüş $this->getWords(); ) ) $insan = yeni İnsan(); $human->setSex("erkek"); $human->setWords("Merhaba!"); echo $insan->sayIt();

    Burada bir İnsan gösteriliyor, bu sınıfta özel yaptığımız "cinsiyet"i (cinsiyet) ekledik - bu, harici kullanıcıların ona erişmesine izin vermeyecektir.

    Bu alana sınıfın dışından erişme girişimi şöyle görünür:

    $insan->seks = "11"; ölümcül hata: Özel mülkiyete erişilemiyor İnsan::$seks

    Kapsülleme, OOP'nin çok kullanışlı bir özelliğidir ve oldukça sık kullanılır. Kapsülleme, belirli bir projenin oluşturulmasında bütün bir uzmanlar grubu yer alıyorsa inanılmaz derecede faydalıdır. Her programcı, diğer uzmanların çalışmalarına müdahale etmeden belirli bir sınıf ve yöntemlerle çalışacaktır.

    Miras

    Ayrıca OOP'nin çok önemli bir özelliği, belirli bir sınıfın işlevselliğini başka bir sınıfa miras alabilmesidir.

    Ve yine kalıtımın özelliklerini anlamanıza yardımcı olacak bir yaşam örneği.

    Her insanın doğumda belirli bir dizi işlevi vardır, bu sözde temel kümedir - nefes almak, yiyecekleri sindirmek, ağlamak.

    İlk atalardan kan ebeveynlerine kadar çok sayıda gen zincirinin bir kombinasyonusunuz. OOP'yi düşünürsek, bu durumda kalıtım özelliği basit yaşamdan farklı değildir.

    Nasıl çalışır? Temel işlevselliğe sahip ebeveyn sınıfları vardır - yeni bir sınıf oluştururken, yeni temel beceriler oluşturmak gerekli olmayacaktır, başlangıçta ana sınıfın "temelini" devralacaktır. Bu, programcıların işini büyük ölçüde basitleştirir. Kalıtım anlamına gelen "extends" kelimesi var, şimdi size belirli bir örnek gösterelim:

    /* Ana sınıf İnsan */ class İnsan ( private $isim; /* Yapıcı (sınıfın bir örneğini oluştururken $isim alanını belirlediğimiz yer) */ public function __construct($name) ( $this->name = $name; ) /* İnsanın başlangıçta konuşabileceğini varsayarak say() yöntemi */ public function say() ( echo "Benim adım ".$this->name." ve "; ) ) /* Class Man. extends anahtar sözcüğüyle, Human üst öğesini */ class Man extensions Human ( public function beard() ( echo "Sakal bırakıyorum"; ) ) /* Class Woman'ı devralırız. Ana İnsan öğesini, extensions anahtar sözcüğüyle devralırız */ class Women extends Human ( public function bearChildren() ( echo "I'm have children"; ) ) /* Man sınıfının bir örneğini yaratın ve metotları çağırın. */ $man = new Man("Sergey"); $man->say(); $adam->sakal(); /* Women sınıfının bir örneğini yarat ve metotları çağır. */ $kadın = yeni Kadın("Maria"); $kadın->say(); $kadın->bearChildren();

    Sonuç olarak ne göreceğiz:

    Benim adım Sergey ve sakalım uzuyor Benim adım Maria ve çocuklarım var

    Oluşturulan sınıfları düşünürsek - her ikisinin de temel becerileri vardır, ancak farklılıklar vardır - "Erkek" sakal bırakır, "Kadın" bir çocuk doğurur.

    __construct adlı metot, sınıfın kurucusudur.

    polimorfizm

    Aynı program yöntemi farklı davranışlar gösterebilir. Bunu hemen anlamak oldukça zordur, bu yüzden Geleneksel olarak, polimorfizmin özelliklerini anlayabilmeniz için daha basit bir örnek kullanıyoruz:

    Bir markete geldiğinizi hayal edin - kasiyer size herhangi bir ürünü satabilir, kartla veya nakit ödeme kabul edebilir.

    Peki nasıl? OOP'de bir yöntemin farklı davranışını anlamak artık daha kolay mı?

    Polimorfizm örneği:

    /* Bu, Say arabirimidir */ interface Say ( public function say(); ) /* Bu, Say arabirimini uygulayan soyut İnsan sınıfıdır */ abstract class İnsan, Say( özel $ad; genel işlev __construct($ad) uygular ( $this-> name = $name; ) public function getName() ( return $this->name; ) ) /* Man sınıfı, Human sınıfını miras alır ve say() yöntemini uygulamalıdır */ class Man, İnsanı genişletir ( public function __construct($name) ( parent::__construct($name); ) public function beard() ( echo "Sakallarım uzuyor"; ) public function say() ( echo "Bıraktım) erkek sesi, benim adım ".$this->getName()." ve "; ) ) /* Kadınlar sınıfı, İnsan sınıfını devralır ve say() yöntemini uygulamalıdır */ class Women, İnsanı genişletir ( public function __construct($name) ( parent::__construct($name); ) public function bearChildren () ( echo "Benim çocuklarım var"; ) genel işlev say() ( echo "Benim çocuklarım var) kadın sesi, benim adım ".$this->getName()." ve "; ) ) $man = new Man("Sergey"); $man->say(); $man->beard(); $women = new Women("Maria"); $women->say() ; $kadın->bearChildren(); ?>

    Sonuç:

    Erkek sesim var, adım Sergey ve sakalım uzuyor Kadın sesim var, adım Maria ve çocuklarım var

    Sınıflarımız değiştirildi, yeni kavramlar ortaya çıktı - Arayüz ve Soyut Programlama. Bu yönü biraz sonra ele alacağız.

    say() yönteminin Erkek ve Kadın sınıflarında farklı uygulanmasına dikkat edin - Buna polimorfizm denir.

    Arayüz Özellikleri

    Arayüz bir şablon sınıfıdır, uygulama yoktur. Arayüz, sonraki uygulama gerektiren belirli yöntemleri tanımlamanıza izin verir.

    Önceki örneği ele alalım:

    /* Bu, Say arabirimidir */ arabirim Say ( public function say(); )

    Bu arayüz, İnsan soyut sınıfında uygulanmalıdır. Bunu yapmak oldukça basit - sınıfın adını buluyoruz ve hemen ardından "uygulamalar" ekliyoruz.

    Soyut sınıf

    OOP'deki bir soyut sınıf, somutlaştırılamayan bir şablon sınıfıdır.

    Yapamadıklarımıza bir örnek:

    $insan = yeni İnsan("isim");

    Her durumda, bir hata alacağız.

    Abstract sınıfının kalıtım olasılığı vardır. Soyut sınıfın başka bir örneği:

    /* Bu, Say arabirimini uygulayan soyut bir İnsan sınıfıdır */ soyut sınıf İnsan, Say( private $ad; public function __construct($name) ( $this->name = $name; ) public function getName() ( dönüş $bu-> isim; ) )

    sonuçlar

    OOP, oldukça karmaşık programların yapılarını yetkin bir şekilde düzenlemenizi sağlayan inanılmaz derecede kullanışlı bir modern yoldur. Diğer geliştiriciler, OOP sayesinde büyüyen bir işlevsel projeyi destekleyebilecek. Bu, OOP'nin oldukça önemli bir avantajıdır.

    büyük kursta modüllerde, OOP'nin teorik temeli ve modülde pratik uygulama ile tanışacaksınız.

    Oldukça basit örnekler verdik - bu, programlama segmentine yeni başlayanlar için harika bir fırsat! Becerilerinizi daha da geliştirmek için OOP'nin özelliklerini anlamanıza, en önemli ilkeleri öğrenmenize yardımcı olduğumuzu umuyoruz. Gelecekteki birkaç makale önemli konuları ele almayı amaçlayacaktır. anahtar kelimeler genel, özel, korumalı, statik. Tüm özellikleri çok basit örneklerde görün.

    Nesne yönelimli programlama (OOP) kavramı, kırk yılı aşkın bir süre önce, prosedürel programlama fikirlerinin bir gelişimi olarak ortaya çıktı. Prosedürel programlamanın ideolojisi özel bir şey değildir: tüm programlar bir dizi prosedür ve işlevle temsil edilirken, prosedürler ve işlevlerin kendileri, bilgisayarın bellekteki değişkenlerin değerlerini değiştirdiği yürütülerek ifade dizileridir. Prosedürel programlamadaki ana program aynı zamanda, gövdesinde diğer prosedürlere ve fonksiyonlara - alt programlara çağrı yapılabilen bir prosedürdür (işlev). Prosedürel programlamanın özü basittir: veriler ayrıdır, davranış ayrıdır. Prosedürel programlama dilinin nelerden oluştuğunu (hangi yapıları içerdiğini) ayrı bir bölümde toplamaya çalıştım. Kodun alt programlara bölünmesi, ilk olarak, yeniden kullanılabilir kod parçalarını vurgulamanıza olanak tanır ve ikinci olarak, program kodunu yapılandırılmış hale getirir.

    Adından da anlaşılacağı gibi, nesne yönelimli programlama ideolojisi, bir nesne kavramı etrafında inşa edilmiştir. Bir nesne hem verileri hem de davranışı birleştirir. Bir nesne, programın ilgilendiği herhangi bir varlıktır, yani: program tarafından modellenen konu alanının nesneleri; işletim sistemi kaynakları; ağ protokolleri ve daha fazlası. Aslında, bir nesne aynı yapıdır (bileşik tip), ancak bu yapının öğelerini kontrol eden prosedürler ve işlevlerle desteklenmiştir. Örneğin, prosedürel bir programlama dilinde bir dosyayla çalışmak için, dosya adını depolamak için ayrı ayrı ve tanımlayıcısını (işletim sisteminde benzersiz bir kaynak tanımlayıcısı) depolamak için ayrı ayrı bir değişken ve bunun yanı sıra bir dizi prosedür oluşturulacaktır. bir dosyayla çalışma: bir dosyayı açın, dosyadaki verileri okuyun ve dosyayı kapatın. Tüm bu prosedürler, sonucu depolamak için kullanılan olağan parametrelere ve değişkenlere ek olarak, hangi dosyadan bahsettiğimizi anlamak için aynı tanımlayıcıyı kabul etmelidir. Nesne yönelimli bir dilde, aynı amaç için bir dosya nesnesi tanımlanır, bu nesne aynı zamanda kendi içinde bir ad ve tanımlayıcı depolar ve kullanıcıya kendisini (belirli bir dosyayla ilişkili dosya) açma, okuma ve kapatma prosedürleri sağlar. nesne). Aradaki fark, tutamacın programın geri kalanından gizlenmesi, dosya açma prosedürünün kodunda oluşturulması ve dolaylı olarak yalnızca nesnenin kendisi tarafından kullanılması olacaktır. Böylece, nesnenin kullanıcısı (nesnenin dışındaki programın program kodu), prosedür parametrelerinde her seferinde tanımlayıcıyı geçmek zorunda kalmayacaktır. Bir nesne, uygulama ayrıntılarının ait olduğu, bazıları etrafındaki dünyadan gizlenmiş olabilecek bir dizi veri ve bu verilerle çalışmak için yöntemlerdir. Nesne yönelimli programlamanın terminolojisi hakkında daha fazla bilgi ileride tartışılacaktır.

    Nesne yönelimli bir programlama dilinde operatörler dışında hemen hemen her şey bir nesnedir: her iki temel tür de nesnedir ve bir hatanın tanımı bir nesnedir ve son olarak ana program da bir nesnedir. Programın bakış açısından bir nesnenin ne olduğunu, nasıl yaratıldığını ve kullanıldığını anlamak kalır. OOP'nin ikinci temel kavramı sınıftır. Bir sınıf, örneklerine nesne adı verilen yordamsal programlamaya kıyasla çok yeni bir veri türüdür. Daha önce bahsedildiği gibi bir sınıf, bileşik bir veri türüne veya yapısına benzer, ancak verileriyle çalışmak için prosedürler ve işlevler (yöntemler) ile desteklenir. Şimdi nesne yönelimli programlamanın temel terimlerini açıklamanın zamanı geldi.

    Nesne Yönelimli Programlama Terminolojisi

    OOP'nin yazılım geliştiricilere yazılım ürünlerini tasarlama, kodlama ve test etme sürecinde sağladığı faydaları anlatmaya geçmeden önce, bu alanda en sık kullanılan terimlere aşina olmak gerekir.

    • Sınıf– nesnelerin yapısını ve davranışını tanımlayan veri türü.
    • Bir obje sınıfın bir örneğidir.
    • Alan– sınıf veri öğesi: temel türde bir değişken, bir yapı veya bir sınıfın parçası olan başka bir sınıf.
    • nesne durumu– nesne alanlarının geçerli değerleri kümesi.
    • YöntemÇağrıldığı nesne bağlamında yürütülen bir prosedür veya işlev. Yöntemler, geçerli nesnenin durumunu veya kendilerine parametre olarak iletilen nesnelerin durumunu değiştirebilir.
    • Mülk– bir nesnenin ayrı ayrı alanlarını değiştirmek için tasarlanmış özel bir yöntem türü. Özellik adları genellikle karşılık gelen alan adlarıyla aynıdır. Dışarıdan, özelliklerle çalışmak, bir yapı veya sınıfın alanlarıyla çalışmakla tamamen aynı görünür, ancak aslında, bir alana yeni bir değer döndürmeden veya atamadan önce, çeşitli türde kontroller gerçekleştiren program kodu çalıştırılabilir, örneğin kontrol etme yeni bir değerin geçerliliği için .
    • sınıf üyesi– sınıfın alanları, yöntemleri ve özellikleri.
    • Erişim değiştiriciek özellik harici bir programdan erişilip erişilemeyeceğini veya yalnızca sınıfın sınırları içinde kullanılıp kullanılmadığını ve dış dünyadan gizlenip gizlenmediğini belirleyen sınıf üyeleri. Erişim değiştiricileri, bir sınıfın tüm üyelerini uygulama ayrıntılarına ve genel veya kısmen genel bir arabirime ayırır.
    • Yapıcı- sınıfın bir örneğini oluşturduktan hemen sonra yürütülen özel bir yöntem. Yapıcı, nesnenin alanlarını başlatır - nesneyi başlangıç ​​durumuna getirir. Yapıcılar parametreli veya parametresiz olabilir. Parametresiz bir oluşturucuya varsayılan oluşturucu denir ve bu yalnızca bir olabilir. Bir yapıcı yöntemin adı çoğunlukla sınıfın adıyla aynıdır.
    • yok edici- nesne kaldırıldığı anda program yürütme ortamı tarafından çağrılan özel bir yöntem rasgele erişim belleği. Yıkıcı, sınıf açık yayın gerektiren kaynaklar (dosyalar, veritabanı bağlantıları, ağ bağlantıları vb.)
    • Arayüz- bir nesnenin halka açık olan ve belirli bir dizi görevi çözmek için tasarlanmış bir dizi yöntemi ve özelliği, örneğin, bir nesnenin ekranda grafiksel bir temsilini oluşturmak için bir arabirim veya bir nesnenin durumunu kaydetmek için bir arabirim bir dosyada veya veritabanında.
    • statik üye– karşılık gelen bir nesne yaratmadan kullanılabilen bir sınıfın herhangi bir üyesi. Örneğin, bir sınıf yöntemi tek bir alan kullanmıyorsa ve yalnızca kendisine iletilen parametrelerle çalışıyorsa, o zaman hiçbir şey onun ayrı örneklerini oluşturmadan sınıfın tamamı bağlamında kullanılmasını engellemez. Bir sınıf bağlamındaki sabitler genellikle her zaman sınıfın statik üyeleridir.

    Nesne Yönelimli Programlamanın Faydaları

    Şimdi bir programın tasarım ve kodlamasında nesne yönelimli bir yaklaşım kullanırken edindiği özelliklerden bahsedelim. Bana öyle geliyor ki bu özelliklerin çoğu OOP'nin avantajları, ancak bu konuda başka görüşler de var ...

    • kapsülleme bireysel üyelerini uygun erişim değiştiricilerle ödüllendirerek sınıfların uygulama ayrıntılarının gizlenmesini ifade eder. Böylece, programın diğer nesneleri ile etkileşime girmeyi amaçlayan nesnenin tüm işlevselliği, açık bir arayüzde gruplandırılır ve ayrıntılar, bilgi sisteminin iş mantığının ana kodunu gereksiz şeylerden kurtaran ayrıntılar içinde dikkatlice gizlenir. . Kapsülleme, operasyonel güvenilirliği artırır program kodu, çünkü belirli verilerin içeren sınıfın dışında değiştirilememesini sağlar.
    • Miras. OOP'nin temel taşı. Nesne yönelimli programlamada, bir sınıfın yapısını ve davranışını başka bir sınıftan miras almak mümkündür. Miras alınan sınıfa temel veya üst sınıf denir ve miras sonucu elde edilen sınıfa türetilmiş veya sadece alt sınıf denir. Herhangi bir sınıf hem bir üst sınıf hem de bir alt sınıf olarak hareket edebilir. Sınıf kalıtım ilişkileri bir sınıf hiyerarşisi oluşturur. Çoklu kalıtım, aynı anda birkaç üst sınıftan türetilmiş bir sınıfın tanımıdır. Tüm nesne yönelimli programlama dilleri çoklu kalıtımı desteklemez. Kalıtım, yeniden kullanılabilir kod parçacıklarını ayırmanın etkili bir yoludur, ancak daha sonra tartışılacak olan dezavantajları da vardır.
    • soyutlama. Hepsi için ortak, önemli özellikleri (ortak alanlar ve ortak davranış) vurgulayarak sınıfları ayrı gruplar halinde birleştirme yeteneği. Aslında soyutlama, kalıtımın bir sonucudur: temel sınıfların gerçek dünya nesneleri üzerinde her zaman kendi projeksiyonları yoktur, yalnızca tüm bir nesne grubunun ortak özelliklerini vurgulamak için yaratılırlar. Örneğin, bir mobilya nesnesi, bir masa, sandalye ve kanepe için temel bir kavramdır, hepsi taşınabilir bir mülk olması, binanın iç kısmının bir parçası olması ve bir ev veya ofis için yapılabilmeleri gerçeğiyle birleştirilir. ve ayrıca "ekonomi" veya "premium" sınıfına bakın. OOP'nin bunun için ayrı bir konsepti vardır - soyut bir sınıf - nesneleri yaratılamayan ancak temel sınıf olarak kullanılabilen bir sınıf. Kalıtım ve soyutlama, program veri yapılarını ve aralarındaki ilişkileri, ele alınan etki alanı modelindeki karşılık gelen nesnelerin göründüğü gibi tam olarak aynı şekilde tanımlamayı mümkün kılar.

    Mevcut araç türlerinin analizi sırasında soyutlama ile oluşturulmuş bir sınıf diyagramı örneği aşağıdaki şekilde gösterilmektedir. Kalıtım hiyerarşisinin üst seviyelerinde, araçları en önemli özelliklerine göre birleştiren soyut sınıflar bulunur.

    Sınıf diyagramı veya kalıtım hiyerarşisi "Araçlar". Beyaz kareler soyut sınıfları temsil eder.

    • polimorfizm. Kalıtımın bir sonucu olan başka bir özellik. Gerçek şu ki, nesne yönelimli programlama dilleri, aynı hiyerarşideki bir dizi nesneyle, sanki hepsi temel sınıflarının nesneleriymiş gibi çalışmanıza izin verir. Mobilya ile ilgili örneğe dönersek, o zaman bir mobilya mağazası için bir bilgi sistemi oluşturma bağlamında, tüm mobilya türleri için temel sınıfa herkes için ortak olan "özellikleri göster" yöntemini eklemenin makul olduğunu varsayabiliriz. . Her tür malın özelliklerini yazdırırken, program ayrım gözetmeksizin tüm nesneler için bu yöntemi çağırır ve her belirli nesne kendisine hangi bilgileri sağlayacağına kendisi karar verir. Nasıl uygulanır: İlk olarak, temel sınıfta herkes için ortak olan bir yöntem, herkes için ortak bir davranışla tanımlanır. Örneğimizde, bu, herhangi bir mobilya türü için ortak olan parametreleri yazdıran bir yöntem olacaktır. İkinci olarak, türetilmiş her sınıfta, gerektiğinde, temel yöntemi geçersiz kılarlar (aynı ada sahip bir yöntem eklerler), burada temel davranışı kendileriyle genişletirler, örneğin, yalnızca belirli bir mobilya tipinin karakteristiği olan özellikleri gösterirler. ürün. Bir temel sınıftaki bir yöntemin bazen herhangi bir kod içermesi gerekmez, ancak yalnızca adı ve parametre kümesini - yöntem imzasını - belirlemek için gereklidir. Bu tür yöntemlere soyut yöntemler denir ve bunları içeren sınıflar otomatik olarak soyut sınıflara dönüşür. Dolayısıyla, polimorfizm, belirli bir arayüz aracılığıyla farklı sınıflardaki nesnelerle tek biçimli iletişim olasılığıdır. Polimorfizm ideolojisi, bir nesneyle iletişim kurmak için türünü bilmenize gerek olmadığını, ancak hangi arabirimi desteklediğini bilmeniz gerektiğini söyler.
    • Arayüz. Bazı programlama dillerinde (C#, Java), arabirim kavramı açıkça vurgulanmıştır - bu yalnızca sınıfın kendisinin genel yöntemleri ve özellikleri değildir. Bu tür diller genellikle çoklu kalıtımı desteklemez ve herhangi bir nesnenin bir temel nesneye sahip olmasına ve herhangi bir sayıda arabirim uygulamasına izin vererek bunu telafi eder. Yorumlarındaki arayüz benzerliktir soyut sınıf, yalnızca genel yöntemlerin ve özelliklerin açıklamasını (imzasını) içerir. Arayüzün uygulanması, onu destekleyecek her sınıfın omuzlarına düşer. Aynı arayüz, polimorfizm olasılıklarını genişleten tamamen farklı hiyerarşi sınıfları tarafından uygulanabilir. Örneğin, "veritabanındaki bilgileri kaydet/geri yükle" arayüzü, hem "mobilya" hiyerarşisinin sınıflarını hem de mobilya üretimi için sipariş vermeyle ilişkili sınıfları uygulayabilir ve "kaydet" düğmesine tıkladığınızda, program tüm nesneleri gözden geçirecek, onlardan bu arayüzü isteyecek ve uygun yöntemi çağıracaktır.

    Nesne yönelimli programlama, görünüş yönelimli, özne yönelimli ve hatta aracı yönelimli programlama gibi yeni paradigmalara yol açarak sürekli olarak gelişmektedir. OOP'nin defnelerinin diğer teorisyenlerin peşini bırakmadığı ve onu geliştirmek ve genişletmek için kendi seçeneklerini sunmak için acele ettikleri belirtilmelidir. Prototipleme, bir sınıf kavramını ortadan kaldırır, onun yerine bir prototipi, bir nesnenin örneğini koyar. Bu nedenle, prototip odaklı bir dilde, bir nesnenin türü kavramı yoktur, ancak bir örnek veya prototip kavramı vardır. Prototip, üyeleri kopyalanarak (klonlanarak) diğer örneklerin oluşturulduğu bir nesne örneğidir. JavaScript'te, bir sınıfın alanlarını ve yöntemlerini tanımlamazsınız, ancak önce boş bir nesne oluşturursunuz ve ardından ona gerekli alanları ve yöntemleri eklersiniz (JavaScript'te, bir yöntem tanımlanabilir ve dinamik olarak bir nesneye eklenebilir). Benzer şekilde, diğer nesneler tarafından prototip olarak adlandırılan prototipler oluşturulur. Nesnenin çağrı yerinde belirtilen bir yöntemi veya alanı yoksa, prototipinin üyeleri arasında aranır.

    Modern nesne yönelimli programlamanın bazı unsurları

    Zaman durmuyor ve OOP'nin ortaya çıkışından bu yana çok şey geçti, bu nedenle bugün nesne yönelimli programlamanın kelime dağarcığının ciddi şekilde artması şaşırtıcı olmamalı. İşte OOP ile ilgili bazı yeni terimler ve kavramlar.

    • Olaylar. Bazı nesneleri diğer nesnelerle meydana gelen olaylar hakkında bilgilendirmek için oluşturulmuş özel bir tür nesne. Farklı programlama dillerinde, olay mekanizması farklı şekillerde uygulanır: bir yerde özel sözdizimsel yapıların yardımıyla ve bir yerde temel OOP araçlarının yardımıyla.
    • Genel tip. Jenerik tip kavramı doğrudan OOP kavramı ile ilgili değildir, ancak jenerik sınıf gibi elemanların ortaya çıkma sebebidir, evrensel yöntem, genel bir olay vb. Genel bir tür, başka bir tür (bir dizi tür) tarafından parametreleştirilmiş bir türdür. Belirli bir sınıftan türetilecek parametre türlerinin değerlerini kısıtlamak veya belirli arayüzleri uygulamak mümkün olsa da, genel tip tasarımı bağlamında bu parametre türünün ne olduğu bilinmemektedir. Bir örnek, dizideki öğenin türünün önceden bilinmediği, bir dizi öğeyi sıralamak için genel bir sınıftır. Böyle bir sınıf tasarlarken, type parametresinin bir karşılaştırma işlemini desteklemesi gerektiğini belirtmek önemlidir. Genel türde nesneler oluştururken, tamsayı veya dize türü gibi açık bir parametre belirtilir ve nesnenin kendisi, özellikle tamsayıları veya dizeleri sıralamak için oluşturulmuş bir sınıfın örneğiymiş gibi davranır.
    • İstisnalar. Belirli bir programlama dilinde yerleşik hata ve istisna işleme mekanizması tarafından desteklenen başka bir özel nesne türü. İstisnalar, hata koduna ek olarak, açıklamasını, olası nedenlerini ve programda istisna oluşmadan önce gerçekleşen yöntem çağrı yığınını içerir.

    Nesne Yönelimli Programlamanın Dezavantajları

    Yazılım ürünleri oluşturmaya yönelik nesne yönelimli yaklaşımın popülaritesinin çok büyük olduğunu zaten söyledim. Bu paradigmayı genişletmek isteyenlerin oldukça fazla olduğu gerçeğini de zaten belirtmiştim. Ancak, dünyadaki büyük profesyoneller topluluğu arasında öne çıkmanın başka bir yolu var. Bilişim teknolojisi FKÖ'nün kendisini haklı çıkarmadığını, her derde deva değil, daha çok bir plasebo olduğunu söylemektir. Bu insanlardan bazıları gerçekten uzman yüksek sınıf Christopher Date, Alexander Stepanov, Edsger Dijkstra ve diğerleri gibi ve fikirleri dikkati hak ediyor, ancak hakkında "kötü bir dansçıyı her zaman bir şeyler engeller" dedikleri kişiler de var. İşte uzmanların işaret ettiği OOP'nin en belirgin eksiklikleri:

    1. OOP, büyük sınıf hiyerarşileri oluşturur, bu da işlevselliğin yayılmasına veya dedikleri gibi, sınıfın temel ve türetilmiş üyeleri arasında bulanıklaşmasına ve belirli bir yöntemin çalışma mantığını izlemenin zorlaşmasına yol açar. .

    2. Bazı dillerde, temel türler de dahil olmak üzere tüm veriler nesnedir ve bu, ek bellek ve işlemci zaman maliyetlerine yol açmaz.

    3. Ayrıca, program yürütme hızı, türetilmiş sınıflardan birinde özel uygulamasıyla bir yöntem çağrısının geç bağlanma mekanizmalarına dayanan polimorfizmin uygulanmasından olumsuz etkilenebilir.

    4. Psikolojik yön. Pek çok insan OOP'nin harika olduğunu düşünür ve yaklaşımlarını her zaman, her yerde ve ayrım gözetmeksizin kullanmaya başlar. Bütün bunlar, özellikle programların üretkenliğinde bir azalmaya ve genel olarak OOP'nin itibarını kaybetmesine yol açar.

    Java, nesne yönelimli bir dildir. Bu, Java programlarının nesne yönelimli bir stil kullanılarak yazılması gerektiği anlamına gelir. Ve bu stil, programdaki nesnelerin ve sınıfların kullanımına dayanmaktadır. Örneklerin yardımıyla sınıfların ve nesnelerin ne olduğunu ve ayrıca OOP'nin temel ilkelerinin nasıl uygulamaya konulacağını anlamaya çalışalım: soyutlama, kalıtım, polimorfizm ve kapsülleme.

    nesne nedir?

    İçinde yaşadığımız dünya nesnelerden oluşur. Etrafımıza bakarsak, etrafımızın evler, ağaçlar, arabalar, mobilyalar, tabaklar, bilgisayarlar ile çevrili olduğunu görürüz. Tüm bu öğeler nesnelerdir ve her birinin bir dizi belirli özelliği, davranışı ve amacı vardır. Nesnelere alışkınız ve onları her zaman çok özel amaçlar için kullanırız. Örneğin işe gitmemiz gerekiyorsa araba kullanırız, yemek yemek istersek bulaşık kullanırız ve rahatlamamız gerekirse rahat bir kanepeye ihtiyaç duyarız. Bir kişi, günlük yaşamdaki sorunları çözmek için nesnel düşünmeye alışkındır. Bu, programlamada nesnelerin kullanılmasının nedenlerinden biriydi ve program oluşturmaya yönelik bu yaklaşıma nesne yönelimli deniyordu. Bir örnek alalım. geliştirdiğinizi hayal edin. yeni model telefon ve seri üretimine başlamak istiyorum. Bir telefon tasarımcısı olarak ne işe yaradığını, nasıl çalışacağını ve hangi parçalardan oluşacağını (kasa, mikrofon, hoparlör, teller, düğmeler vb.) bilirsiniz. Bu durumda, bu parçaları nasıl bağlayacağınızı yalnızca siz bilirsiniz. Ancak kişisel olarak telefon üretmeyi planlamıyorsunuz, bunun için tüm çalışanlardan oluşan bir kadronuz var. Her seferinde telefonun parçalarının nasıl birleştirileceğini anlatmak zorunda kalmamak ve üretim sırasında tüm telefonların aynı çıkması için önceden telefon cihazının açıklaması şeklinde bir çizim yapmanız gerekecektir. serbest bırakıldılar. OOP'de, böyle bir açıklama, çizim, diyagram veya şablon, bir program yürütüldüğünde bir nesnenin oluşturulduğu bir sınıf olarak adlandırılır. Sınıf, henüz yaratılmamış bir nesnenin tanımıdır, sanki alanlar, yöntemler ve bir yapıcıdan oluşan genel bir şablondur ve nesne, bu açıklamaya dayanarak oluşturulan bir sınıfın bir örneğidir.

    Soyutlama

    Şimdi örnek olarak telefonu kullanarak gerçek dünyadaki bir nesneden programdaki bir nesneye nasıl geçebileceğimizi düşünelim. Bu iletişim aracının geçmişi 100 yılı aşıyor ve modern telefon, 19. yüzyıldaki selefinin aksine çok daha karmaşık bir cihaz. Bir telefonu kullanırken yapısını ve içinde gerçekleşen süreçleri düşünmeyiz. Bir numara seçmek ve arama yapmak için sadece telefon geliştiricileri tarafından sağlanan özellikleri - düğmeleri veya dokunmatik ekranı kullanıyoruz. İlk telefon arayüzlerinden biri, arama yapmak için döndürülmesi gereken bir kranktı. Tabii ki, bu çok uygun değildi. Bununla birlikte, tutamak işlevini düzgün bir şekilde yerine getirdi. En modern ve ilk telefona bakarsanız, hem 19. yüzyılın sonlarına ait cihaz hem de ultra modern akıllı telefon için önemli olan en önemli ayrıntıları hemen vurgulayabilirsiniz. Bunlar arama yapma (arama) ve arama almadır. Özünde, bir telefonu telefon yapan şey budur, başka bir şey değil. Şimdi prensibi OOP'de uyguladık - en çok vurgulayarak önemli özellikler ve nesne hakkında bilgi. Bu ilkeye soyutlama denir. OOP'de soyutlama, bir görevin öğelerini gerçek dünyadan bir programdaki nesneler olarak temsil etmenin bir yolu olarak da tanımlanabilir. Soyutlama her zaman nesnelerin veya nesnelerin özellikleri hakkındaki bazı bilgilerin genelleştirilmesiyle ilişkilendirilir, bu nedenle asıl mesele, çözülmekte olan problem bağlamında önemli bilgileri önemsiz bilgilerden ayırmaktır. Birkaç soyutlama düzeyi olabilir. Soyutlama ilkesini telefonlarımıza uygulamaya çalışalım. Başlamak için, ilk günden günümüze en yaygın telefon türlerini vurgulayalım. Örneğin, Şekil 1'de gösterilen bir diyagram biçiminde temsil edilebilirler. Şimdi, soyutlamayı kullanarak, bu nesneler hiyerarşisinde seçim yapabiliriz. Genel bilgi: genel soyut nesne türü - telefon, Genel özellikleri telefon - yaratıldığı yıl ve ortak arayüz - tüm telefonlar çağrı alabilir ve gönderebilir. Java'da şöyle görünür: public abstract class AbstractPhone ( private int yıl; public AbstractPhone (int yıl) ( this .year = year; ) public abstract geçersiz çağrı (int outputNumber) ; public abstract void ring (int inputNumber) ; ) Bu soyut sınıfa dayanarak, aşağıda tartışacağımız diğer temel Java OOP ilkelerini kullanarak programda yeni telefon türleri oluşturabileceğiz.

    kapsülleme

    Kullanarak soyutlamalar tahsis ederiz genel tüm nesneler için. Ancak, her telefon modeli bireyseldir ve diğerlerinden biraz farklıdır. Programda sınırları nasıl çizebilir ve bu bireyselliği nasıl belirleyebiliriz? Kullanıcılardan hiçbirinin yanlışlıkla veya kasıtlı olarak telefonumuzu kırmayacağından veya bir modeli diğerine dönüştürmeye çalışmayacağından nasıl emin olabiliriz? Gerçek nesnelerin dünyası için cevap açıktır: tüm detayları telefon kılıfına koymanız gerekir. Sonuçta, bu yapılmazsa ve telefonun tüm iç kısımları ve onları birbirine bağlayan teller dışarıda bırakılırsa, kesinlikle telefonumuzun çalışmasını "iyileştirmek" isteyen meraklı bir deneyci olacaktır. Bir nesnenin tasarımında ve işleyişinde bu tür müdahaleleri hariç tutmak için OOP, kapsülleme ilkesini kullanır - başka bir temel prensip Bir nesnenin özniteliklerinin ve davranışının tek bir sınıfta birleştirildiği, nesnenin dahili uygulamasının kullanıcıdan gizlendiği ve nesneyle çalışmak için genel bir arabirimin sağlandığı OOP. Programcının görevi, hangi özniteliklerin ve yöntemlerin genel erişime açık olacağını ve hangilerinin nesnenin dahili uygulaması olduğunu ve değiştirilmemesi gerektiğini belirlemektir.

    Kapsülleme ve erişim kontrolü

    Örneğin, üretim sırasında telefonun arkasına onunla ilgili bilgiler kazınmıştır: piyasaya sürüldüğü yıl veya üretici firmanın logosu. Bu bilgi, bu modeli - durumunu oldukça spesifik olarak karakterize eder. Telefonun geliştiricisinin bu bilgilerin değişmezliğiyle ilgilendiğini söyleyebiliriz - herhangi birinin gravürü kaldırmayı düşünmesi pek olası değildir. Java dünyasında, gelecekteki nesnelerin durumu, alanlar kullanılarak sınıfta tanımlanır ve davranışları, yöntemler kullanılarak tanımlanır. Durumu ve davranışı değiştirme yeteneği, alanlara ve yöntemlere erişim değiştiricileri kullanılarak gerçekleştirilir - özel, korunan, kamu , Ve varsayılan (varsayılan erişim). Örneğin, oluşturma yılı, telefon üreticisinin adı ve yöntemlerden birinin sınıfın dahili uygulamasına ait olduğuna ve programdaki diğer nesneler tarafından değiştirilemeyeceğine karar verdik. Kod kullanılarak sınıf şu şekilde tanımlanabilir: genel sınıf SomePhone ( özel int yıl; özel String şirketi; genel SomePhone (int yıl, String şirket) ( bu . yıl = yıl; bu . şirket = şirket; ) özel geçersiz openConnection ( ) ( / /findComutator //openNewConnection... ) genel geçersiz arama () ( openConnection() ; System.out.println ("Bir numarayı arama") ; ) genel geçersiz zil sesi () ( System.out.println ("Zil sesi") halka") ; ) ) Değiştirici özel bir sınıfın alanlarını ve yöntemlerini yalnızca o sınıf içinde kullanılabilir hale getirir. Bu şu anlama gelir: erişim özel saha dışından arama imkanı olmadığı gibi imkansız özel yöntemler. openConnection yöntemine erişimin gizlenmesi, bu yöntemin diğer nesneler tarafından kullanılmaması ve çalışmalarını bozmaması garanti edildiğinden, bu yöntemin dahili uygulamasını değiştirme konusunda da bizi özgür bırakır. Nesnemizle çalışmak için, değiştiriciyi kullanarak call ve ring yöntemlerini açık bırakıyoruz. halk . Bir nesneyle çalışmak için genel yöntemler sağlamak da kapsülleme mekanizmasının bir parçasıdır, bu nedenle bir nesneye erişimi tamamen kapatırsanız, o nesne işe yaramaz hale gelir.

    Miras

    Telefon şemasına tekrar bakalım. Alttaki modelin, daldaki yukarıdaki modellerin tüm özelliklerine ek olarak kendi özelliklerine sahip olduğu bir hiyerarşi olduğunu görebilirsiniz. Örneğin, iletişim kurmak için hücresel ağ kullanan (cep telefonu özelliklerine sahip), kablosuz ve taşınabilir (kablosuz telefon özelliklerine sahip) ve çağrı alıp alabilen (telefonun özelliklerine sahip) bir akıllı telefon. Bu durumda nesne özelliklerinin kalıtımı hakkında konuşabiliriz. Programlamada kalıtım, yeni sınıfları tanımlamak için mevcut sınıfların kullanılmasıdır. Kalıtımı kullanarak bir akıllı telefon sınıfı oluşturmaya ilişkin bir örneği ele alalım. Tüm kablosuz telefonlar, belirli bir kullanım ömrüne sahip şarj edilebilir pillerle çalışır. Bu özelliği kablosuz telefon sınıfına ekleyelim: public abstract class WirelessPhone extensions AbstractPhone ( private int hour; public WirelessPhone (int year, int hour) ( super (year) ; this . hour = hour; ) ) ayrıca bir uygulama ekledik Bu sınıfa yapılan arama ve çalma yöntemleri: genel sınıf CellPhone, WirelessPhone'u genişletir ( genel Cep Telefonu (int yıl, int saat) ( super (yıl, saat) ; ) @Override genel geçersiz çağrı (int outputNumber) ( System.out.println ( "Arayan numara" + outputNumber) ; ) @Override public void ring (int inputNumber) ( System.out.println ( "Bir abone sizi arıyor"+ girişSayısı); ) ) Ve son olarak, klasik cep telefonlarının aksine tam teşekküllü bir işletim sistemine sahip olan akıllı telefon sınıfı. Bu akıllı telefon tarafından desteklenen yeni uygulamaları akıllı telefonunuza ekleyebilirsiniz. işletim sistemi böylece işlevselliğini genişletiyor. Kod kullanılarak, sınıf şu şekilde tanımlanabilir: genel sınıf Akıllı Telefon, CellPhone'u genişletir ( özel Dizi işlemSystem; genel Akıllı Telefon (int yıl, int saat, Dize işlemSystem) ( süper (yıl, saat) ; bu . işlemSystem = işlemSystem; ) genel geçersiz install (String program) ( System.out.println ("+ processSystem için" + program + " ayarladım) ; ) ) Gördüğünüz gibi, Smartphone sınıfını tanımlamak için epeyce yeni bir kod oluşturduk, ancak yeni işlevselliğe sahip yeni sınıf. OOP java'nın bu ilkesini kullanmak, kod miktarını önemli ölçüde azaltmanıza ve dolayısıyla programcının işini kolaylaştırmanıza olanak tanır.

    polimorfizm

    Tüm telefon modellerine bakarsak, modellerin görünüm ve tasarımındaki farklılıklara rağmen, içlerinde bazı ortak davranışları ayırt edebiliriz - hepsi arama alabilir ve yapabilir ve oldukça net ve basit bir kontrol düğmeleri setine sahip olabilir. OOP'nin temel ilkelerinden biri olan ve bizim tarafımızdan zaten bilinen programlama açısından soyutlama uygulanarak, telefon nesnesinin ortak bir arabirime sahip olduğunu söyleyebiliriz. Dolayısıyla telefon kullanıcıları, cihazın teknik detaylarına girmeden aynı kontrol butonlarını (mekanik veya dokunmatik) kullanarak farklı modelleri oldukça rahat bir şekilde kullanabilirler. Yani sürekli cep telefonu kullanıyorsunuz ve onun sabit hatlı muhatabından kolayca arama yapabilirsiniz. OOP'de bir programın, nesnenin iç yapısını bilmeden aynı arayüze sahip nesneleri kullanabileceği ilkeye denir. polimorfizm . Herhangi bir telefon modelini kullanabilen bir kullanıcıyı başka bir kullanıcıyı aramak için programda tanımlamamız gerektiğini düşünelim. Bunu şu şekilde yapabilirsiniz: public class User ( private String name; public User (String name) ( this . name = name; ) public void callAnotherUser (int numarası, AbstractPhone phone) ( // işte polimorfizm - kodda Soyut Telefon telefon soyut türünü kullanıyor! telefon. çağrı (numara); ) ) ) Şimdi farklı telefon modellerini anlatalım. İlk telefon modellerinden biri: public class ThomasEdisonPhone extensions AbstractPhone ( public ThomasEdisonPhone (int yıl) ( super (year) ; ) @Override public void call (int outputNumber) ( System.out.println("Turn the knob" ) ); System .out .println( "Telefon numaranı ver beyefendi") ; ) @Override genel geçersiz zil sesi (int inputNumber) ( System.out.println ("Telefon çalıyor") ; ) ) Normal sabit hatlı telefon: genel sınıf Phone, AbstractPhone'u genişletir ( genel Telefon (int yıl) ( süper (yıl) ; ) @ Genel geçersiz aramayı geçersiz kıl (int outputNumber) ( System.out.println ("Bir numara arıyorum" + outputNumber) ; ) @Override genel geçersiz zil sesi (int inputNumber) ( System.out.println ("Telefon çalıyor" ) ; ) ) Ve son olarak, harika görüntülü telefon: genel sınıf VideoPhone, AbstractPhone'u genişletir ( genel VideoPhone (int yıl) ( süper (yıl) ; ) @Override genel geçersiz çağrı (int outputNumber) ( System.out.println ( "Abone için bir video kanalı bağlarım"+ çıkışNumarası); ) @Override genel geçersiz halka(int inputNumber)( System.out.println( "Gelen bir görüntülü aramanız var..."+ girişSayısı); ) ) main() yönteminde nesneler oluşturun ve callAnotherUser yöntemini test edin: AbstractPhone firstPhone = new ThomasEdisonPhone (1879 ) ; AbstractPhone telefon = yeni Telefon(1984) ; AbstractPhone videoPhone= yeni VideoPhone (2018 ) ; Kullanıcı kullanıcı = yeni Kullanıcı("Andrey" ) ; kullanıcı callAnotherUser (224466 , ilkTelefon) ; // Düğmeyi döndürün // Abone numarasını söyle hocam kullanıcı callAnotherUser (224466 , telefon) ; //Arama numarası 224466 kullanıcı callAnotherUser (224466 , videoTelefon) ; //224466 abonesi için video kanalını bağlarım Kullanıcı nesnesinde aynı yöntemi çağırarak farklı sonuçlar elde ettik. callAnotherUser yöntemi içindeki çağrı yönteminin belirli bir uygulamasının seçimi, programın yürütülmesi sırasında onu çağıran nesnenin belirli türüne göre dinamik olarak yapıldı. Bu, polimorfizmin ana avantajıdır - programın yürütülmesi sırasında uygulama seçimi. Yukarıdaki telefon sınıfı örneklerinde, yöntem imzasını değiştirmeden temel sınıfta tanımlanan yöntem uygulamasını değiştiren bir teknik olan yöntem geçersiz kılma kullandık. Bu aslında bir yöntem değiştirmedir ve program yürütüldüğünde çağrılan alt sınıfta tanımlanan yeni yöntemdir. Genellikle, bir yöntemi geçersiz kılarken, derleyiciye geçersiz kılınan ve geçersiz kılınan yöntemlerin imzalarını kontrol etmesini söyleyen @Override ek açıklaması kullanılır. Sonunda programınızı OOP konseptine ve OOP java ilkelerine göre şekillendirmek için şu ipuçlarını izleyin:
    • nesnenin ana özelliklerini vurgulayın;
    • ortak özellikleri ve davranışı vurgulayın ve nesneleri oluştururken kalıtımı kullanın;
    • nesneleri tanımlamak için soyut türleri kullanın;
    • sınıfın dahili uygulamasıyla ilgili yöntemleri ve alanları her zaman gizlemeye çalışın.

    Muhtemelen, boş pozisyonların yarısında (daha fazla değilse), OOP bilgisi ve anlayışı gereklidir. Evet, bu metodoloji kesinlikle birçok programcıyı büyüledi! Bu konuda neredeyse hiçbir uygun ve erişilebilir materyal bulunmadığından, genellikle, OOP'nin anlaşılması deneyimle birlikte gelir. Ve varsa bile, okuyucuların bunlara rastlayacağı bir gerçek değil. Umarım bu harika metodolojinin ilkelerini dedikleri gibi parmak uçlarında açıklayabilirim.

    Bu yüzden, makalenin başında zaten "metodoloji" teriminden bahsetmiştim. Programlama ile ilgili olarak, bu terim, bir programcının oldukça uygun programlar yazabileceği, kodu düzenlemenin herhangi bir yolunun, onu yazma yöntemlerinin varlığını ima eder.

    OOP (veya nesne yönelimli programlama), programın ana yapı taşları nesneler ve sınıflar olduğunda ve programın mantığı bunların etkileşimi üzerine kurulduğunda, program kodunu düzenlemenin bir yoludur.


    Nesneler ve sınıflar hakkında

    Sınıf- bu, programcının kendisinin oluşturabileceği bir veri yapısıdır. OOP açısından, bir sınıf şunlardan oluşur: alanlar(basit bir şekilde - değişkenler) ve yöntemler(basit bir şekilde - işlevler). Ve ortaya çıktığı gibi, verilerin ve bunlar üzerinde çalışmanın işlevlerinin tek bir yapıda birleştirilmesi düşünülemez bir güç veriyor. Bir obje sınıfın somut bir örneğidir. Bir veri yapısına sahip bir sınıfın analojisine uygun olarak, bir nesne, alanları kendilerine atanmış bazı değerlere sahip olan somut bir veri yapısıdır. Bir örnekle açıklayayım:

    Diyelim ki iki kenarı ve aralarında bir açı olan bir üçgenin çevresini ve alanını hesaplayan bir program yazmamız gerekiyor. OOP kullanarak böyle bir program yazmak için, bir sınıf (yani bir yapı) Üçgen oluşturmamız gerekecek. Üçgen sınıfı üç alan (üç değişken) saklayacaktır: A tarafı, B tarafı, aralarındaki açı; ve iki yöntem (iki işlev): çevreyi hesapla, alanı hesapla. Bu sınıf ile herhangi bir üçgeni tanımlayabilir, çevresini ve alanını hesaplayabiliriz. Bu nedenle, belirli kenarları ve aralarında bir açı bulunan belirli bir üçgen, Üçgen sınıfının bir örneği olarak adlandırılacaktır. Bu nedenle, bir sınıf bir şablondur ve bir örnek, şablonun somut bir uygulamasıdır. Ancak örnekler zaten nesnelerdir, yani belirli değerleri depolayan belirli öğelerdir.

    Java, en yaygın kullanılan nesne yönelimli programlama dillerinden biridir. Nesneleri kullanmadan yapmak imkansızdır. Bu dilde bir üçgeni tanımlayan bir sınıfın kodu şöyle görünür:

    /** * Üçgen sınıfı. */ class Triangle ( /** * Class yapıcısı adı verilen özel bir metot. * Girdi olarak üç parametre alır: * A kenarının uzunluğu, B kenarının uzunluğu, * bu kenarlar arasındaki açı (derece cinsinden) */ Triangle(double sideA, double sideB , double angleAB) ( this.sideA = sideA; this.sideB = sideB; this.angleAB = angleAB; ) double sideA; //Class alanı, tanımlanan üçgende A kenarının değerini saklar double kenarB; //Sınıf alanı, açıklanan üçgende B kenar değerini saklar double angleAB; //Tanımlanan üçgende iki kenar arasındaki açıyı (derece cinsinden) depolayan sınıf alanı /** * * Alanını hesaplayan sınıf yöntemi ​​üçgen */ double getSquare() ( double square = this.sideA * this .sideB * Math.sin(this.angleAB * Math.PI / 180); dönüş karesi; ) /** * Çevreyi hesaplayan sınıf yöntemi */ double getPerimeter() ( double sideC = Math.sqrt(Math.pow (this.sideA, 2) + Math.pow(this.sideB, 2) - 2 * this.sideA * this.sideB * Math .cos(this.angleAB * Math.PI / 180)); çift ​​çevre = this.sideA + this.sideB + sideC; dönüş çevresi; ) )

    Aşağıdaki kodu class içine eklersek:

    /** * Programın başladığı yer burasıdır */ public static void main(String args) ( //5, 17, 35 değerleri Triangle sınıfı yapıcısına gider Triangle Triangle1 = new Triangle(5, 17, 35); System.out .println("Üçgen1'in Alanı: "+triangle1.getSquare()); System.out.println("Üçgen1'in Çevresi: "+triangle1.getPerimeter()); //Değerler ​​6, 8, 60, Üçgen sınıfı yapıcısına gidin Üçgen üçgen2 = yeni Üçgen(6, 8, 60); System.out.println("Üçgen1'in alanı: "+triangle2.getSquare()); System.out. println("Üçgen1'in Çevresi: "+triangle2.getPerimeter()); )

    o zaman program zaten yürütme için başlatılabilir. Bu bir özellik java dili. Sınıfın böyle bir yöntemi varsa

    genel statik geçersiz ana (dize argümanları)

    o zaman bu sınıf yürütülebilir. Kodu daha ayrıntılı olarak inceleyelim. Çizgi ile başlayalım

    Üçgen üçgen1 = yeni Üçgen(5, 17, 35);

    Burada, Üçgen sınıfından bir üçgen1 örneği oluşturuyoruz ve ona hemen kenarların parametrelerini ve aralarındaki açıyı veriyoruz. Aynı zamanda yapıcı adı verilen özel bir yöntem çağrılır ve nesnenin alanlarını yapıcıya iletilen değerlerle doldurur. Peki, çizgiler

    System.out.println("Üçgen1'in Alanı: "+triangle1.getSquare()); System.out.println("Üçgen1'in Çevresi: "+triangle1.getPerimeter());

    üçgenin hesaplanan alanını ve çevresini konsola yazdırın.

    Benzer şekilde, Triangle sınıfının ikinci örneği için her şey olur.

    Sınıfların ve yapının özünü anlamak belirli nesneler OOP metodolojisini anlamaya yönelik sağlam bir ilk adımdır.

    Bir kez daha, en önemlisi:

    OOP program kodunu düzenlemenin bir yoludur;

    Sınıf- bu, verileri ve işlevleri onlarla çalışmak için birleştiren özel bir veri yapısıdır (sınıf alanları ve sınıf yöntemleri);

    Bir obje alanları belirli değerlere ayarlanmış bir sınıfın belirli bir örneğidir.


    Üç sihirli kelime

    OOP üç temel yaklaşım içerir: kalıtım, kapsülleme ve polimorfizm. İlk olarak, işte wikipedia'daki tanımlar:

    Kapsülleme, verileri ve bunlarla çalışan yöntemleri bir sınıfta birleştirmenize izin veren bir sistem özelliğidir. Bazı diller (örneğin, C++) kapsüllemeyi gizleme ile eşit tutar, ancak çoğu (Smalltalk, Eiffel, OCaml) bu kavramlar arasında ayrım yapar.

    Kalıtım, kısmen veya tamamen ödünç alınmış işlevselliğe sahip mevcut bir sınıfı temel alan yeni bir sınıfı tanımlamanıza izin veren bir sistem özelliğidir. Miras aldığınız sınıfa temel, üst veya üst sınıf denir. Yeni sınıf, soyundan gelen, ardıl, alt veya türetilmiş bir sınıftır.

    Polimorfizm, nesnenin türü ve iç yapısı hakkında bilgi olmadan aynı arayüze sahip nesnelerin kullanılmasına izin veren bir sistem özelliğidir.

    Tüm bu tanımların pratikte ne anlama geldiğini anlamak oldukça zordur. Bu konuyu ele alan özel kitaplarda, her tanım genellikle tüm bir bölüme, ancak en azından bir paragrafa sahiptir. Bununla birlikte, anlaşılması ve programlayıcınızın beynine sonsuza kadar kazınması gereken şeyin çok az özü vardır.
    Ve uçaktaki rakamlar analiz için örnek teşkil edecek. Okul geometrisinden, bir düzlemde açıklanan tüm şekillerin çevresini ve alanını hesaplamanın mümkün olduğunu biliyoruz. Örneğin bir nokta için her iki parametre de sıfırdır. Bir segment için sadece çevreyi hesaplayabiliriz. Ve bir kare, dikdörtgen veya üçgen için - her ikisi de. Şimdi bu sorunu OOP cinsinden açıklayacağız. Sırasıyla çalışma kodunda somutlaşan bir sınıf hiyerarşisi ile sonuçlanan akıl yürütme zincirini yakalamak da yararlıdır. Gitmek:


    yani nokta en küçüğü geometrik şekil, diğer tüm yapıların (şekillerin) temelidir. Bu nedenle, nokta temel üst sınıf olarak seçilir. Java'da bir nokta sınıfı yazalım:

    /** * Puan sınıfı. Temel sınıf */ class Point ( /** * Boş yapıcı */ Point() () /** * Bir şeklin alanını hesaplayan sınıf yöntemi */ double getSquare() ( return 0; ) /** * Şeklin çevresini hesaplayan sınıf yöntemi */ double getPerimeter() ( return 0; ) /** * Şeklin açıklamasını döndüren sınıf yöntemi */ String getDescription() ( return "Point"; ) )

    Ortaya çıkan Point sınıfı boş bir oluşturucuya sahiptir, çünkü bu örnek belirli koordinatlar olmadan çalışıyoruz ve yalnızca parametrelerle çalışıyoruz - kenarların değerleri. Noktanın kenarları olmadığı için ona herhangi bir parametre iletilmesine gerek yoktur. Ayrıca, sınıfın alanı ve çevreyi hesaplamak için Point::getSquare() ve Point::getPerimeter() yöntemlerine sahip olduğuna dikkat edin, her ikisi de 0 döndürür. Bir nokta için bu mantıklıdır.


    Noktamız diğer tüm şekillerin temeli olduğu için, bu diğer şekillerin sınıflarını Point sınıfından devralırız. Point sınıfından miras alınan segment sınıfını açıklayalım:

    /** * Segment sınıfı */ class LineSegment extensions Point ( LineSegment(double segmentLength) ( this.segmentLength = segmentLength; ) double segmentLength; // Segment length /** * Segment alanını hesaplayan geçersiz kılınan sınıf yöntemi */ double getSquare( ) ( return 0; ) /** * Segment çevresini hesaplayan geçersiz kılınan sınıf yöntemi */ double getPerimeter() ( return this.segmentLength; ) String getDescription() ( return "Segment length: " + this.segmentLength; ) )

    Sınıf LineSegment, Noktayı genişletir

    LineSegment sınıfının Point sınıfından miras aldığı anlamına gelir. LineSegment::getSquare() ve LineSegment::getPerimeter() yöntemleri, karşılık gelen temel sınıf yöntemlerini geçersiz kılar. Bir parçanın alanı her zaman sıfıra eşittir ve çevrenin alanı bu parçanın uzunluğuna eşittir.

    Şimdi segment sınıfı gibi, üçgen sınıfını da tanımlayalım (ki bu da point sınıfından miras alır):

    /** * Üçgen sınıfı. */ class Triangle extensions Point ( /** * Class yapıcı. Girdi olarak üç parametre alır: * A kenarının uzunluğu, B kenarının uzunluğu, * bu kenarlar arasındaki açı (derece olarak) */ Triangle(double sideA, double sideB) , double angleAB ) ( this.sideA = sideA; this.sideB = sideB; this.angleAB = angleAB; ) double sideA; //Sınıf alanı, açıklanan üçgende A tarafının değerini saklar çift kenarB; //Sınıf alanı, tarif edilen üçgende B tarafının değerini saklar çift açılıAB; //Tanımlanan üçgende iki kenar arasındaki açıyı (derece cinsinden) depolayan sınıf alanı /** * Bir üçgenin alanını hesaplayan sınıf yöntemi */ double getSquare() ( double square = (this.sideA * this.sideB * Math.sin(this.angleAB * Math.PI / 180))/2; dönüş karesi; ) /** * Çevresini hesaplayan sınıf yöntemi bir üçgen */ double getPerimeter() ( çift kenarC = Math.sqrt(Math.pow(this.sideA, 2) + Math.pow(this.sideB, 2) - 2 * this.sideA * this.sideB * Math. cos(this.angleAB * Math.PI / 180)); çift ​​çevre = this.sideA + this.sideB + sideC; dönüş çevresi; ) String getDescription() ("Üçgen kenarlı: " + this.sideA + ", " + this.sideB + " ve aralarındaki açı: " + this.angleAB; ) )

    Burada yeni hiçbir şey yok. Ayrıca, Triangle::getSquare() ve Triangle::getPerimeter() yöntemleri karşılık gelen temel sınıf yöntemlerini geçersiz kılar.
    Pekala, şimdi, aslında, polimorfizmin büyüsünü gösteren ve OOP'nin gücünü ortaya çıkaran kod:

    Class Main ( /** * Programın başladığı yer burasıdır */ public static void main(String args) ( //ArrayList, java'da özel bir veri yapısıdır ve // ​​belirli bir türdeki nesneleri bir dizide saklamanıza izin verir. ArrayList rakamlar = yeni ArrayList (); //figürler dizisine üç farklı nesne ekle 55)); için ( int ben = 0;i

    Point sınıfına ait bir nesne dizisi oluşturduk ve LineSegment ve Triangle sınıfları Point sınıfından miras alındığı için bu diziye de koyabiliriz. Figures dizisindeki her figürü Point sınıfının bir nesnesi olarak düşünebileceğimiz ortaya çıktı. Polimorfizm bununla ilgilidir:figures dizisindeki nesnelerin hangi sınıfa ait olduğu bilinmemekle birlikte bu dizi içindeki tüm nesneler aynı Point temel sınıfına ait olduğu için Point sınıfına uygulanan tüm yöntemler onun sınıfına da uygulanır. soyundan gelen sınıflar.


    Şimdi kapsülleme hakkında. Şeklin parametrelerini ve alan ve çevre hesaplama yöntemlerini tek bir sınıfa yerleştirdiğimiz için kapsülleme nedir, şekilleri ayrı sınıflarda kapsülledik. Çevreyi hesaplamak için sınıfta özel bir yöntem kullanmamız kapsüllemedir, çevre hesaplamasını getPerimiter() yönteminde kapsülledik. Başka bir deyişle, kapsülleme, uygulama gizlemedir (kapsüllemenin belki de en kısa ve aynı zamanda kapsamlı tanımı).


    Tam örnek kod:

    java.util.ArrayList'i içe aktarın; class Main ( /** * Programın başladığı yer burasıdır */ public static void main(String args) ( //ArrayList, java'da // belirli bir türdeki nesneleri bir dizide saklamanıza izin veren özel bir veri yapısıdır. ArrayList rakamlar = yeni ArrayList (); //figürler dizisine üç farklı nesne ekle 55)); için ( int ben = 0;i