OO programlama faydaları nelerdir?

19 Cevap php

Ben PHPer değilim, ve nesne yönelimli kod yazmıyorum.

Prosedürel kod üzerinde OO avantajları nelerdir, ve PHP için bu fikirleri uygulamak için nasıl nerede öğrenebilirim?

19 Cevap

It doesn't help you automatically. tersi yapısal programlardan daha kötü "OO" programları yazabilir ve. OOP daha güçlü soyutlamalar oluşturmak için olanak sağlayan bir araçtır.

  • Her güçlü bir araç olduğu gibi, düzgün kullanmak zorunda.
  • Her güçlü bir araç olduğu gibi, onu doğru kullanmayı öğrenmek zaman alır.
  • Her güçlü aracıyla gibi hatalar yapar.
  • Her güçlü bir araç olduğu gibi bir çok uygulama gerekecektir.
  • Her güçlü bir araç olduğu gibi bu konuda çok okudum, ve diğer insanların ne düşündüğünü okumalısınız. Başkalarından öğrenmek.
  • Ancak, her güçlü bir araç olduğu gibi, bunu kötüye orada insanlar var. Onlardan kötü uygulamaları öğrenmek için öğrenin. Bu çok zor.

Gevşek bir bağlantı: Eğer bir bölümüne bir değişiklik yapmak gerekiyorsa bunu diğer bölümleri etkilemez emin olabilir, böylece nesneler, farklı bölümler arasında izole kodunuzu tutmaya yardımcı.

Bir süre için yaptık o zaman, size bir app için oluşturulan nesneleri bulma başlayacağız başkalarına da yararlıdır, ve siz de daha iyi kod yeniden kullanımını başlar. Yani yeni uygulama zaten bitmiş işin parçası olan, ve zaman içinde test edilmiş kodu kullanıyor: yazılım daha hızlı daha az hata ile inşa edilmiştir.

İnsanlar, çeşitli açılardan, size OOP hakkında çeşitli şeyler anlatacağım. Eğer kendi görüş oluşturmak yerine, başkasının almak istiyorsanız, o zaman ben Bertrand Meyer'in "Nesne Tabanlı Yazılım İnşaat" okumanızı öneririz.

Esasen, o olmayan cepten programlama tekniklerini alır, ve temel kusurlarını analiz eder. Daha sonra bu kusurları gideren bir alternatif tekniği gelmektedir. Başka bir deyişle, o ilk ilkelerinden OOP kaynaklanmaktadır. Bu işin muhteşem bir parçası ve çok convinving.

Oku, sen neden, ne zaman ve ne akıl ile yedekleyebilirsiniz bir şekilde öğreneceksiniz.

Nesneler karmaşıklığı çevreliyor yardımcı olur. Çoğu PHP programlama için, herhangi bir makul karmaşık bir uygulama için iyi, temiz kod yazmak imkansız. OO PHP Yazma başka her şeyden tecrit, kendi kutusunun içine bu kodu koymak olur. Bunun birçok faydası vardır.

  1. Sürece nesne açıkça girişleri ve çıkışları, nesne değil önemi yok ne yapar bu şekilde tanımlandığı gibi - veri alma / depolama Oracle MySQL MEMCACHE için XML düz dosya gidebiliriz, ve sadece hiç tek bir nesne ile kendinizi endişe var.
  2. Sürece obje net girişler ve çıkışlar tanımlandığı gibi, tamamen aynı giriş / çıkışları olan başka bir nesne ile değiştirebilirsiniz. Eğer memcached MySQL, Postgres, isteyip zamanında karar, veya HTTP POST / Endonezya kabataslak bir sunucuya GET istekleri.
  3. OO birim test kolaylaştırır. Belirli bir nesnenin ne yapması gerektiğini tanımlayabilirsiniz eğer (yani belirli bir girişi için size vermelidir sonuçları ne) sonra kolayca bu kodu karşı değerlerin binlerce test sonuçlarını kontrol etmek için kod yazabilir, ve siz bileceksiniz anında eğer bir şey sonları.
  4. Eğer kod daha, nesnelerin size bu işlevselliği kullandığınız zaman görmek zorunda bunun daha az 'gizlemek'. Ve ben sadece (Poll::Display()) web sitemdeki bir kod satırı gereken - veritabanı etkileşimi, anket nesil, oylama, sıralama sıralama ve görüntüleme - ben yoklama tüm yönlerini ele aldıklarını PHP bir kez yoklama uygulama yazdı çok kolay Anasayfam koruyarak yapılan - app yapabileceklerinin tamamını uygulamak.

Aklında tek bir şey tutun - PHP OO (hatta PHP5) Python ya da Ruby gibi bir dil ile karşılaştırıldığında çok iyi OO değil. Python her şeyi-olan-bir-nesne modeli beni OO programlama gerçekten benim için tıklayın yapılmış nedir - ve anlamak istiyorsanız, eski bir PHP programcısı (ve iki kat sertifikalı Zend mühendisi) olarak, ben şiddetle Python'un Ö.Ö. keşfetmek tavsiye ne OO tüm hakkında. Bu en azından, daha iyi PHP kodu yazmak yardımcı olacaktır.

Evet, gerçekten olsun.

Bu daha büyük bir sistemin parçaları birbirleri ile etkileşim nasıl görselleştirmek yardımcı olur. Bu tasarım seviyesinde çok kullanışlı.

Sadece birkaç kod satırları yazarken iseniz, alacağınız tek yararı genellikle sadece işlevleri daha iyi tasarlanmış nesnelere ayrılır bir kitaplık kullanmak biraz daha kolay olmasıdır.

Bunu en iyi şekilde yapmak için, aynı zamanda ses OO tasarım uygulamalarını takip etmek gerekir. Her zaman birçok küçük sınıflar, asla büyük "catch-all" sınıfları kullanarak, TÜM veri kapsülleme. Sınıf yerine veri soran vb sınıfın dışında iş yapmanın sizin için işi yapmak zorunda

Muhtemelen bir süre için size çok yardımcı olacak değil, ve her zaman küçük web siteleri yapıyoruz (Herhalde bu söyleyemem, ben gerçekten php yapmıyorum), muhtemelen asla, ama olabilir zamanla ve büyük projeler üzerinde paha biçilmez.

Hiç kimse bu sözü olan bir şey OO kod okunabilir kod yazma kolaylaştırır olduğunu:

sherry.changePhoneNumber();
phoneCompany.assignNewPhoneNumberTo(sherry);
sherry.receive(new PhoneNumber().withAreaCode("555").withNumber("194-2677"));

Ben böyle estetik bir strange satisfaction olsun.

Benim için büyük bir galibiyetti miras, ya da bir kaç farklılıklar ile ama neredeyse tam olarak başka bir nesne gibi davranır yapıyor. İşte benim ofisinden bir gerçek dünya örnek:

Biz bize gönderilen bir müşteri, bir sonuç e-posta göndermek, sonra, standart bir biçime dönüştürmek bir veritabanına dosya hakkında bazı bilgiler eklemek olduğunu TIFF dosyalarını işlemek için kod gerekli. Ben sınıfları bir dizi bu yazdı (Python, ancak fikir aynıdır). "Alıcısı" sınıf bir POP3 posta kutusundan e-posta aldım ve bir e-posta ekleri okuma bilen bir "kapsayıcı" sınıfına uzattı. Bu sınıf gerekli işleme yaptım bir "dosya nesne" sınıfına off her görüntüyü verdi.

Eh, bir gün biz PDF dosyaları göndermek isteyen bir müşteri var. Ben "TIFF dosya nesne" sınıfını sınıflandırma ve yerine girdi olarak bir PDF almak "normalize" fonksiyonunu yeniden yazdı, ama el değmemiş kod diğer her biraz yaptı. Bu ilk kez çalıştı ve ben oldukça memnun oldu.

Bizim mailserverların bir değişiklik Ben IMAP üzerinden e-posta almak için gerekli anlamına geliyordu. Bu IMAP konuşabilir, böylece yine, ben "POP3 Alıcısı" sınıflandırma. Sorun çözüldü.

Başka bir müşteri bize CD'leri posta istedim, bu yüzden bir "dosya dizin" sınıfı ile "e-posta kapsayıcı" sınıfı sınıflandırma. Voila - yapılır.

Bu durumların her birinde, yeni kod eski kod% 95 benzer. Örneğin, "TIFF dosya nesne" sınıf yaklaşık 15 yöntemleri vardır. "PDF dosyası nesne" class tam bir tanımlar: bizim standart içine belirli bir formatta dosyaları dönüştürür yöntemi. Tüm diğerleri kendi ana sınıfından alır.

Şimdi, kesinlikle böyle yazarak gibi, prosedür şeyler aynı tür yapabilirsiniz:

if fileobjecttype == 'TIFF':
    data = <snip 30 lines of code to read and convert a TIFF file>
elif fileobjecttype == 'PDF':
    data = <another 45 lines to read a PDF>
elif fileobjecttype == 'PNG':
    data = <yep, another one>

En büyük fark, ben cepten bakmak çok daha temiz ve daha organize hale inanıyoruz olmasıdır. Benim PDF sınıf gibi görünüyor:

class PDFReader(GenericImageReader):
    def normalize(self):
        data = <45 lines to read a PDF>

ve bu kadar. Bunu sadece farklı o devralan sınıfından daha bir şey yapar ki, bir bakışta anlayabilirsiniz. Ayrıca sizi zorlar - ya da en azından kuvvetle teşvik - uygulamanın katmanları arasında temiz arabirimleri yapmak için. Benim örnekte, PdfReader hiçbir fikri vardır ve imajını bir POP3 posta kutusu veya CD-ROM geldi olsun umurumda değil. POP3 fetcher onun işi sadece e-posta alma ve onları boyunca geçen olduğundan, ekleri hakkında kesinlikle hiçbir şey bilmiyor. Uygulamada, bu bize kodlama mutlak minimum miktarda bazı oldukça şaşırtıcı şeyler yapmak veya yeniden izin verdi.

OOP sihirli değil, ancak organize kodunuzu tutmak için oldukça harika bir yoldur. Her yerde kullanabilirsiniz bile, yine de gerçekten gelişmesi gereken bir yetenektir.

Bir zaman ben kullanıcı odaklı kodu yazmış, ben ilk programlama başladı ne zaman geri vardı. Bu harika çalıştı, ancak korumak için zordu.

Sonra, ben Ö.Ö. öğrendim ve yazdığım kod projeler arasında paylaşmak kolay, bakımı daha kolay hale gelir ve hayat benim kullanıcılar dışında herkes için ... iyi oldu.

Şimdi, ben bilgisayar programlama gerçek gümüş kurşun biliyorum. Ben OO kod yazmak, ama ilk i objectify my users. Insanları nesne olarak tedavi başta kaba görünebilir, ama çok daha şık her şeyi yapar olabilir - all açıkça tanımlanmış arayüzleri ile çalışmak için yazılım yazmak için olsun, ve bir kullanıcı beklenmedik bir ileti gönderdiğinde yapabilirsiniz sadece bunu görmezden, ya da, yeterli önemi simgeleyen bir bayrak ile işaretlenmiştir eğer, onlara bir istisna.

Hayat, OO, iyidir ...

Ben bu şekilde koymak istiyorum: Eğer karmaşık bir şey yazarsanız, yerine bir şekilde kullandığınız dil yerli kavramları düşünmeye çalışmak yerine, düşünmek kavramları kodlamak gerekir. Daha az hata yapmak bu şekilde. Bu kavramların resmileştirilmesi tasarımı denir.

Fonksiyonel programlama her fonksiyon esas fiil (örneğin, print ()) olduğundan, fiiller ile ilişkili kavramları tanımlamak sağlar. OO programlama, diğer taraftan, aynı zamanda isimler ile ilgili kavramları tanımlamak sağlar.

Ben bazen nesne yönelimli PHP Dabbles uzun süre prosedürel PHP programcı değilim. Yukarıda Joel'ın cevabı yararları mükemmel bir özetidir. Benim görüşüme göre, bir ince ikincil fayda, daha iyi baştan gereksinimleri tanımlamak için zorlar olmasıdır. Sen onların üzerine hareket edilecektir nesneleri ve yöntemleri arasındaki ilişkileri anlamak zorunda.

A good book to help with the transition is Peter Lavin's "Object-Oriented PHP".
alt text

Joeri cevabı üzerinde durmak için biraz:

Standardizasyon için Uluslararası Örgütü gibi kapsüllemeyi tanımlayan 'bir nesnenin içerdiği bilgiler yalnızca nesne tarafından desteklenen arabirimleri ile etkileşim yoluyla erişilebilir özellik.'

Bazı bilgiler bu arayüzler üzerinden erişilebilir olarak Böylece, bazı bilgiler nesne içindeki gizli ve ulaşılmaz olmalıdır. Mülkiyet gibi bilgiler sergiler Parnas modülleri zor kararlar ve değiştirme olasılığı olan kararlar hem gizlemek için tasarlanmış gerektiğini savunarak tarafından tanımlanan bilgi gizleme, denir.

Değişiklik: bu kelimeyi unutmayın. Bilgi saklama gibi gelecekte zor tasarım kararlarının değiştirilmesi gibi potansiyel olayları ile ilgilidir.

Yöntem () sınıfı içinde gizli bilgiler ve diğer sınıflar tarafından doğrudan halka ve böylece erişilebilir yöntemi b () olan: İki yöntem ile bir sınıf düşünün.

Yöntemi a bir gelecekte değişiklik () diğer sınıflara yöntemlerinde değişiklikler gerektirmektedir belirli bir olasılık vardır. Yöntem b, gelecekteki bir değişiklik () başka sınıflara yöntemlerinde değişiklikler gerektirir ki belli bir olasılık bulunmaktadır. Bu tür dalgalanma değişiklikler yöntemi için ortaya çıkar ihtimali (), Ancak, genellikle yöntemi b () daha fazla sınıfları tarafından bağlıydı olabilir çünkü) (yöntem b için daha düşük olacaktır.

Dalgalanma etkilerinin bu azaltılmış olasılık kapsülleme önemli bir şeydir.

Herhangi bir programda - kaynak kodu bağımlılıkları maksimum potansiyel numarası (kısaltma grafik teorisi dan MPE) düşünün. Yukarıdaki tanımlardan götürdüğümüzde, biz kullanıcılara aynı işlevselliği sağlayan iki program verilen, düşük MPE ile programı daha iyi kapsüllü ve bu istatistiksel olarak daha iyi kapsüllü programı korumak ve geliştirmek için ucuz olacak, diyebiliriz çünkü maliyeti buna maksimum potansiyel değişimin daha az kapsüllenmiş sistem maksimum potansiyel değişiklik daha düşük olacaktır.

, Ayrıca, dolayısıyla sadece yöntemleri ve hiçbir sınıflar ve enformasyon birbirinden yöntemlerini gizleme hiçbir anlamı ile bir dil düşünün. Adlı program 1000 yöntemleri vardır diyelim. Bu programın MPE nedir?

Encapsulation teorisi n kamu düğümler bir sistem verilen bu sistemin MPE n (n-1), söyler. Dolayısıyla bizim 1000 genel yöntemlerin MPE 999.000 olduğunu.

Şimdi iki sınıfa, 500 yöntemleri sahip her birine bu sistemi kırılsın. Şimdi sınıfları var gibi, biz bazı yöntemler kamu ve bazı yöntemler özel seçebilirsiniz. Her yöntemi (aslında pek mümkün değildir) her metoduna bağlıdır sürece bu böyle olacaktır. Kullanıcının her sınıfta 50 yöntemler kamu olduğunu varsayalım. Sistemin MPE ne olurdu?

Kapsülleme teori bu kadar söyler: n ((n / r) -1 + (r-1) p) r sınıflarının sayısı ve p sınıfı başına genel yöntemlerin sayısıdır. Bu bizim iki-sınıf sistemi 499000 bir MPE verecek. Böylece bu iki sınıf sisteminde bir değişikliği maksimum potansiyel maliyeti zaten kapsüllenmemiş sisteminin bir önemli ölçüde daha düşüktür.

Diyelim ki 3 sınıflar, her tekrar 333 sınıfları (iyi, bir 334 olacak), ve 50 kamu yöntemleri ile herbirinin içine sistemi kırmak diyelim. MPE nedir? Yine, yukarıdaki denklem kullanılarak, MPE yaklaşık 482.000 olacaktır.

Sistem 250 yöntemlerin her biri 4 sınıfa kırılırsa, MPE 449.000 olacaktır olacaktır.

Eğer sistemimizde sınıfların sayısını artırarak her zaman MPE azaltmak, ama bu böyle değildir ki görünebilir. Kapsülleme teori sistem MPE en aza indirmek için ayrıştırılabilir gereken içine sınıflarının sayısı olduğunu göstermektedir:. R = sqrt sistemimizin için gerçekten 4'ü (n / p), 6 sınıflar ile bir sistem, örneğin, bir MPE olurdu 465.666 arasında.

Yükü Prensibi iki formları alır.

Kuvvetli kişilerin bir toplama dönüştürme yük dönüştürülmüş birimlerinin sayısının bir fonksiyonu olduğunu belirtmektedir. Zayıf bir form kişilerin bir koleksiyon dönüştürme maksimum potansiyel yük dönüştürülmüş kuruluşların maksimum potansiyel sayısının bir fonksiyonu olduğunu belirtmektedir.

Biraz daha detaylı olarak, bir yazılım sistemi oluşturma veya modifiye yük oluşturulmuş veya değiştirilmiş program birimlerinin sayısının bir fonksiyonudur.

Belirli bir modifiye program birimi bağlıdır Program birimleri değiştirilmiş program birimi bağlı değilsiniz program birimlerine daha fazla etkilenebilir olma ihtimali daha yüksek.

Bir modifiye programı birim empoze maksimum potansiyel yükü ona bağlı tüm program birimlerinin etkiliyor.

Modifiye edilmiş program birimi üzerinde bağımlılıkları azaltılması dolayısıyla güncelleme diğer program birimleri etkileyecek ve böylece program birimi empoze edebilirsiniz maksimum potansiyel yükünü azaltır olacağı olasılığını azaltır.

Bir sistemdeki tüm program birimleri arasındaki bağımlılıkları maksimum potansiyel sayısını azaltarak, bu nedenle belirli bir program birimi bir etkisi diğer program birimlerinin güncellemeleri neden, ve böylece tüm güncellemeleri maksimum potansiyel yükünü azaltır olacağı olasılığını azaltır.

Böylece, kapsülleme nesne yönelimi temel taşı olduğunu ve kapsülleme tüm program birimleri arasındaki bağımlılıkları maksimum potansiyel sayısını azaltmak ve Yükü İlkesinin zayıf formunu azaltmaya yardımcı olur.

Herkesin anlamıyla soruya yanıt veriyor gibi görünüyor, yani, OO belirli faydaları / dezavantajları.

OO size gereken herhangi bir özel büyü vardır çünkü OO öğrenmek, ama olmamalıdır.

Daha genel şekli şöyledir:

  • S: "Ben (OO, FP, eşzamanlı, mantık bazlı, olay odaklı, ...), programlama öğrenmek mi?"
  • A: "Eğer her gün doğrudan kullanmak bile Evet, yeni bir paradigma öğrenme, her zaman yararlıdır."

Wordpress, Drupal veya XOOPS gibi büyük bir sistem, OOP kavramları kullanır. Orada bunların kullanımı faydalarını görebilirsiniz. Kodu yeniden, modülerlik, idame ve genişletilebilirlik.

Nesnelerin parçalarını değiştirmek için yeteneği var ve tüm uygulama etkiler; hayır bazı operasyon yaptı (ve muhtemelen eksik) her yerinde yerini arıyor.

Kopyalama ve yapıştırma korkunç bir çok tasarruf, tüm üzerinde nesneleri yeniden kullanabilirsiniz. Bir hata yama bir nesne, hepsi aynı şeyi kod değil 16 sayfa yama gerektirir.

Eğer mantık ve "gizlemek" uygulama saklanması, bu artık bir şey yaptım, neden unutmuş ne zaman 6 ay için hem nesneleri kullanmak için daha kolay, ve için kod kullanır yuva adam ya da gal. Örneğin, Wordpress mesaj döngü yapmak bütün bir işlevi çağırır. Ben nasıl çalıştığını bilmek gerek yok, ben sadece onu aramak için bilmek gerekir.

OOP gerçekten nesne yöntemleri / fonksiyonları sarılır usul kodudur. Hala nesnelerin yöntemleri ve işlevleri uygulamak için iyi bir lineer kod yazmak için bilmek gerekir. Bu sadece, ölçek yeniden düzeltmek, hata ayıklama ve eşyalarını korumak için çok daha kolay hale getirir.

Ben iki temel faydası vardır söyleyebilirim:

  • Encapsulation: kütüphaneden dışından denilen olmamalıdır kütüphanelerinde kod kullanılmasının önlenmesi, gizli ve dış arabirim koruyarak kütüphanenin iç yapısında değişiklik hızı olabilir. Kod tamamlandıktan sonra iyi OO tasarım, değişiklikler daha kolay tanıtıldı.
  • Soyutlama: yerine böylece çalışanlar, bölümler ve ile uğraşıyoruz Dizilerle ile ilgili. Bu iş mantığı odaklanmak ve daha az sayıda kod satırları yazmak anlamına gelir. Daha az çizgiler daha az hata demektir.

Tamamen prosedür modeli akıllı kütüphane organizasyonda siz de kodu yeniden sağlar, çünkü ben kesinlikle, bir OO fayda olarak hak olmaz yeniden kullanın.

Her istek için çok fazla nesne inşaat yükü var çünkü Öte yandan, PHP nesneleri birçok kullanarak, bir usul modele göre performans azalma eğilimindedir. Usul tarzı ve oo tarzı kodu arasında iyi bir denge bulmak şarttır.

Ben OOP bir nesne veri yanı sıra bu veriler üzerinde çalışan fonksiyonlar oluşmaktadır nerede 'nesneler' olarak düşünenler, uygun olduğunu iddia ediyorum.

  • Eğer fonksiyonları ve bunlar ayrı şeyler olarak faaliyet verileri düşünmek eğilimi varsa, o zaman bir usul programcı.
  • Eğer bağlanmış olarak fonksiyonlarını ve bunlar üzerinde işlem verileri düşünmek eğilimi varsa, o zaman bir nesne yönelimli programcı vardır.

Ben çıkıyor ve patterns öğrenmeye karşı dikkatli olur. Iyi nesne yönelimli programlama yapmak için, bir nesne yönelimli programcı gibi think kendinizi öğretmek gerekir. Sen anlamak ve faydaları adlandırabilir noktasına ulaşmak gerekir:

  • Encapsulation
  • Sınıflar örnekleri / objeler vs
  • Kalıtım

Bu sadece bir programcı programlama daha fazla stil bildiği anlamda daha iyi bir programcı olmak için yardımcı olacaktır, problem çözme ve zarif kod yazma için onun repertuarında daha fazla menzil. Eğer gerçekten cepten nasıl çalıştığını anlamak, ve sadece kopyala-yapıştırma değil günün bazı popüler tasarım desenleri iseniz tüm kod nesne yönelimli otomatik ve daha sonra bazı oldukça yazabilirsiniz iyi kod var, ama çıkmak ve yazamazsınız Büyük bir uygulama yazma, özellikle iyi kod,.

PHP OO öğrenmek için bazı iyi yazılmış OO PHP çerçeve kullanmak deneyin tavsiye ederim.

Sen Zend Framework bakmak isteyebilirsiniz.

Ben güçlü bir cepten bir arka plan var ancak, ben PHP ile OOP kullanılarak en iyi kitap olmak zorunda söyleyebilirim, bir PHP lutfen duyuyorum PHP 5 Objects Patterns and Practice

One of the best thing that I did with OOP in PHP is the class generator. In any given table, it will involve almost the same SQL operations:

  • eklemek
  • güncelleştirme
  • seçmek
  • silmek
  • (bir satır olup olmadığını kontrol edin) Varlığından
  • arama
  • liste

Şimdi özel koşullar hariç, artık bütün bu SQL ifadeleri yazmak zorunda değilsiniz. Ben yukarıdaki yaparken 1 dakika kodlama kestiler değil, ben de kodları ayıklama uzak zaman kurtardım.

Tablo yapısı değişiklikler vardır bu yüzden ne zaman, ben sadece sınıfını yeniden.

Bunun gibi beni ve benim müşteriler için çalışır gibi muhtemelen aynı denemelisiniz!