Perl'de programlama stili


9

Java'da çalışıyorum, bu yüzden kodlama sırasında OOP paradigmasını kullanıyorum. Perl'de çalışmaya başlamak üzereyim ve Perl geliştiricilerinin takip ettiği paradigmanın ne olduğunu merak ediyordum. Wiki'de birçok paradigmayı desteklediğinden bahsediyor, ancak bunu bir betik dili olduğu için anladığımdan emin değilim.

Benim sorum şu: Perl'deki Java deyiminde tanıdığım nesne yönelimli kalıplar mı yoksa etkili Perl yazmak için tasarım tarzımda önemli bir değişikliğe ihtiyacım olacak mı?

Not: Bu Perl'i eleştirmek için bir soru değildir. Aslında Perl'de çalışmak zorundayım ve şu anki programımın nasıl değişeceğini anlamak istiyorum.


3
Daha ciddi bir not olarak, "perl felsefesi" için bir Google Araması yapın ve buraya bir göz atın: perldesignpatterns.com
Robert Harvey

Perl OOP'yi destekler. Sanal işlevleri vb. Uygulamak için sınıf hiyerarşileri oluşturabilirsiniz. En yaygın kullanım değil, yapılabilir.
Martin York

"bir betik dili olduğundan" - bu şekilde kullanılabilir, ancak perl'in Java kadar bir VM olduğunu unutmayın - perl daha sonra yürütülen bayt koduna derlenir (anında). JIT yok, ama bunun dışında hala kodunuzu çalıştıran sanal bir makine.
Tanktalus

Yanıtlar:


15

Perl'in felsefesi, "şimdi pratik olanı yapma" eğilimindedir. OOP kullanmanız gerekiyorsa, orada. Tüm çözümlerde gerekli değildir ve bir kişiyi basit bir "bunu yap o zaman bu" tip problemi olduğunda OOP kodu yazmaya zorlamak çoğu zaman karşı üretken olur.

Perl'in çok paradigma doğası , çok işlevsel yönleri olan Schwartz dönüşümü gibi şeylerde görülebilir (Lisp'de "süsle-sırala-süsle" olarak bilinir). OOP, prosedürel (C benzeri programlama) ve zorunludur (bash "bunu sonra o zaman yap" gibi) mevcuttur.

Tasarım Kalıpları, yaygın sorunlara tekrarlanan çözümlerdir. Her dilde var olurlar . Bazen bu kalıplara deyim denir, ancak bu bir kalıptan çok daha basit şeylere de işaret edebilir.

Gerektiğinde, klasik GOF Tasarım Desenlerinin çoğu perl'de uygulanabilir. Perl Tasarım Desenleri , insanların GOF'a aşina olduğu birçok ortak isme sahip olacaktır. Hepsinin deyimsel perl olması gerekli değildir.

Perl'deki tasarım desenlerini incelerken, lütfen Mark Dominus tarafından değil "Tasarım Desenleri" ni de not edin .

Birçoğu Tasarım Desenlerinin dilde eksiklik olduğunu düşünüyor . Bu açıdan, Yineleyici gibi Tasarım Desenleri perl'de genellikle gereksizdir. Her zaman değil ama sık sık.

İlk olarak, deyimsel perl yazın. Perl'de C, perl'de lisp veya perl'de java yazmaya çalışmayın. Perl perl'dir. Deyimsel perl'in üstesinden gelebilecek bir sorun varsa ve daha karmaşık sınıf yapılarına ihtiyaç duymaya başlarsanız, bunları yazın. "Bu sorun artık soyut bir fabrikaya ihtiyaç duyulan noktaya ulaştı" yı tanıyabilmek için tasarım kalıplarını bilin - ancak ihtiyacınız yoksa perl'de soyut bir fabrika yapmaya çalışmayın.

Bazı kütüphaneler hem OOP hem de daha geleneksel formlarda bulunur. Bkz . İşlev yönelimli veya nesne yönelimli CGI arabirimlerini kullanmalı mıyım? eski bir SO sorusu için nerede kütüphane kullanmak için hangi yolu sorar.


4
Tüm bunları dikkate alarak, SO'da Perl'i eski bir dil olarak savunmaya / saldırmaya çalışan çok sayıda mesaj var mı?
user10326

2
Herkesin kendi favori dili vardır. Birçoğu, bir dil Bu Hafta Yeni Şey'i destekleyemediği sürece, dilin eski ve eski olduğunu ve her şeyin ondan taşınması gerektiğini düşünüyor. Diğerleri belirli bir dili öğrenmek için önemli zaman harcadı ve bulunduğu yerde nasıl çalışacaklarını biliyorlar. Bu, Sıcak Yeni Dil kadar hızlı hareket etmeyen herhangi bir dile kolayca değiştirilebilir. Perl, Perl 6 (herhangi bir gün .. err .. yıl şimdi!) Almak için geçen zaman belirli bir haklarından mahrum kalıyor. Bu, perl öğrenmekten caydırılmamalıdır - birçok yerde kullanılır.

1
Büyük olasılıkla perl'in linux betikleri için eski günlerden kabuk betikleri rolünün çoğunu alan bir lingua franca olduğunu göreceksiniz. Bir * nix sisteminde betik yaparken bash yerine perl betiği yazarsanız yalnızca en kararlı kabuk betikleri şikayet eder. Perl için en önemli şeylerden biri CPAN'dır - eğer biri makul büyüklükte bir kütüphane yazmayı üstlenmek üzereyse, başka birinin zaten yazıp yazmadığını kontrol edin.

1
Eskiden biraz karmaşıklık veya daha büyük bir kabuk betiği olan herhangi bir şey, şimdi bir perl betiğidir. Perl ayrıca genellikle sistemler veya uygulamalar arasında bir yapıştırıcı / koli bandı olarak çalışır. Onun dize işleme de diğer birçok endüstride (özellikle biyoinformatik - evde sadece SO üzerinde perl etiketi içinde kaç DNA tabanlı soru var) bakın.

4
Perl sağlam ve eksiksiz bir programlama dilidir. Komut dosyası oluşturma (kabuk dahil diğer uygulamalarla etkileşimi otomatikleştirme) veya bina yardımcı programları veya hatta daha büyük ölçekli uygulamalar için kullanılabilir. Perl nefreti, yoğun sözdizimi gibi şeylere ve bir dereceye kadar Perl'in kullanıcılarına belirli tasarım modellerini zorlama girişiminde bulunmadığının yanlış anlaşılmasına odaklanma eğilimindedir. Her gün Perl kullanıyorum. Ayrıca diğer dilleri sık sık kullanıyorum. Perl'in ifade ve gücünün tadını çıkarıyorum. Garip öğrenme aşamasını geçin ve çok seveceksiniz.
DavidO

7

Perl'in paradigmalar hakkındaki duruşu TMTOWTDI'dır (bunu yapmanın birden fazla yolu vardır). Bu, birçok insanın şaka yollu Perl'e salt okunur bir dil demesinin nedenlerinden biridir . Yazmak okumaktan çok daha kolay olabilir, çünkü başka bir kişinin tarzı sizinkinden tamamen farklı olabilir.

Bununla birlikte, OOP kesinlikle Perl'de desteklenmektedir. Çok sayıda üçüncü taraf kodu kullanıyorsanız, bu OOP olabilir veya olmayabilir, ancak kendi kodunuz için kalbinizin içeriğine OOP yapabilirsiniz. Aslında ilk önce OOP'yi Perl'de öğrendim. Önce C ++ denedim ve bir nedenle "tıklama" etmedi.


1
Neden birçok insan bunun kötü bir kariyer seçeneği olduğunu düşünüyor? Görünüşe göre güçlü ve diğer dilleri araç setinin bir parçası olarak tamamlayabilir.
user10326

3
Diyelim ki diğer diller neredeyse güçlü ve çok daha doğal bir yapıya sahip. Şirketler yapıyı sever.
Karl Bielefeldt


1
Bu, Perl'in yerleşik OO stilini açıklayan iyi bir OOP öğreticisidir. Bu kodu biraz ayrıntılı bulursanız, yerleşik OO'daki tekrarlayan kodlamanın çoğunu otomatikleştiren Perl kütüphanesi Moose ile ilgilenebilirsiniz. Ancak yerleşik stille başlamak (IMH0) en iyisidir.
mat freake

1
Perl'i hiç kötü bir kariyer seçeneği olarak görmedim. Yerel bir Perl Mongers grubu bulun ve olasılıklar hemen hemen her toplantıda birisinin Perl iş açılışlarından bahsedeceğidir.
DavidO

3

Aynı durumdayım, Java'yı uzun süredir kullanıyorum,

Perl'e taşınmak bir şok ve rahatlama oldu, ancak 'Perl Best Practices' adlı bir kitap kullandım. Çok yardımcı olur ve programlama dillerinin temel kavramlarını anlarsanız, sadece onunla akmak kolaydır.

Sadece perl ile bunu yapmak için daha sonra bir yolu olduğunu unutmayın, ben belirli bir kod bakarak ve değiştirerek sayısız saat geçirdim, ama sonunda basit bir sözdizimi hatası ile iş alır.


0

Perl'de kodun yeniden kullanılmasının birçok yolu vardır. Birçok örnek yaklaşımlar arasındaki ayrımı netleştirmez ve birçok sınıf en az iki kullanır.

OO stilini olabildiğince kullanmanızı ve EXPORTER'ı yalnızca göreceli olarak küçük faydalı fonksiyonlar kümesine ihtiyaç duyan en az üç veya daha fazla sınıfınız olduğunda kullanmanızı öneririm.

Yani:

package Foo; 
use Foo::Util qw(util) ;
use strict ; 

sub foo {
}

sub bar {
}

1; 

package Foo::Bar ;
use Foo ; 
use Foo::Util qw(util) ;
our @ISA = qw(Foo) ; 
use strict ; 

sub bar {
}

1; 

package Foo::Util ; 
use Exporter ; 
our @ISA = qw(Exporter) ; 
our @EXPORT = qw(util) ;
use strict ; 

sub util {
}

1;

OO yaklaşımını ve EXPORTERyaklaşımı, fonksiyonların mevcut pakete x veya y ekseninden geliyormuş gibi, kod kullanılabilirliğinin iki farklı boyutu olarak görselleştirmeyi tercih ediyorum .

Yukarıdaki örnekte:

Foo::Baryöntemi foo()sınıftan türetirFoo

Foo::Barbar()polimorfik yöntemin bar()sınıftan türetilmemesi için bir yöntem tanımlarFoo

Hem sınıflar Foohem de paketten ( sınıf değil ) Foo::Baralma EXPORTEDişlevi ( yöntem değil )util()Foo::Util

İki sistem karmaşık görünüyor ama çok pratik bir faydası var. Birden fazla mirasın izini sürmek zor olabilir. Kod kullanılabilirliğinin ikinci boyutuna sahip olmak, miras ağacınızı küçük ve yönetilebilir tutmanızı sağlar.

Genellikle bir işlev monolitik ve nispeten aptal ise, İHRACATÇI kullanın, aksi takdirde miras kullanın. Ancak, yapacaklarınız EXPORTER3 veya 4'ten fazla paket içerecekse, hiç rahatsız etmeyin .

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