Perl의 프로그래밍 스타일


9

Java로 작업하므로 기본적으로 코딩 중에 OOP 패러다임을 사용합니다. 저는 Perl에서 일을 시작하려고하는데 Perl 개발자들이 따르는 패러다임이 무엇인지 궁금했습니다. 위키에서는 많은 패러다임을 지원한다고 언급하지만 스크립트 언어이기 때문에 이것을 이해하지는 못합니다.

그래서 내 질문은 : Perl의 Java 관용구에 익숙한 객체 지향 패턴입니까, 효과적인 Perl을 작성하려면 디자인 스타일을 크게 변경해야합니까?

참고 : 이것은 Perl을 비판하는 질문이 아닙니다. 저는 실제로 Perl에서 일해야하며 현재 프로그램 방식이 어떻게 바뀌는 지 이해하고 싶습니다.


3
더 중요한 것은 "perl 철학"에 대한 Google 검색을 수행하고 여기를 살펴보십시오. perldesignpatterns.com
Robert Harvey

Perl은 OOP를 지원합니다. 클래스 계층을 구축하여 가상 함수 등을 구현할 수 있습니다. 가장 일반적인 사용법은 아니지만 수행 할 수 있습니다.
Martin York

"스크립팅 언어이므로"-그대로 사용할 수 있지만 perl은 Java만큼 많은 VM임을 기억하십시오. perl은 바이트 코드로 컴파일되어 실행됩니다. JIT는 없지만 여전히 코드를 실행하는 가상 머신입니다.
Tanktalus

답변:


15

펄의 철학은 "지금 실천적인 일을하는"철학이다. OOP를 사용해야하는 경우 OOP가 필요합니다. 모든 솔루션에 필요한 것은 아니며, 간단한 "이 작업을 수행 한 다음이 작업"유형의 문제인 경우 OOP 코드를 작성하도록 강요하는 경우가 종종 있습니다.

Perl의 다중 패러다임 특성은 Schwartzian 변환 과 같이 매우 기능적인 측면을 볼 수 있습니다 (Lisp에서는 "장식-정렬-장식하지 않음"이라고 함). OOP는 절차 적 (C와 같은 프로그래밍)과 명령형 ( "이것 다음에 이렇게하라")과 같이 존재한다.

디자인 패턴은 일반적인 문제에 대한 해결책을 되풀이하고 있습니다. 그들은 모든 언어로 존재 합니다. 때로는 이러한 패턴을 관용구라고하지만 패턴보다 훨씬 단순한 것을 나타낼 수도 있습니다.

필요한 경우 많은 클래식 GOF 디자인 패턴을 펄로 구현할 수 있습니다. Perl 디자인 패턴 은 사람들이 GOF에 익숙한 많은 공통 이름을 갖습니다. 그들 모두가 관용적 펄일 필요는 없습니다.

펄 디자인 패턴을 탐험 할 때, 또한 주목하시기 바랍니다 아닌가 "디자인 패턴" 에 의해 마크 주인님 .

많은 사람들이 디자인 패턴이 언어의 결함 이라고 생각합니다 . 이러한 관점에서 반복자와 같은 디자인 패턴은 종종 perl에서 필요하지 않습니다. 항상 그런 것은 아니지만 종종.

먼저 관용 펄을 작성하십시오. 펄에 C를 쓰거나 펄에 lisp를 쓰거나 펄에 java를 쓰려고하지 마십시오. Perl은 perl입니다. 관용적 펄이 처리 할 수있는 것보다 더 큰 문제가 있고 더 복잡한 클래스 구조가 필요하면 작성하십시오. "이 문제는 이제 추상 팩토리가 필요한 시점까지 커졌다"는 것을 인식 할 수있는 디자인 패턴을 알고 있습니다. 그러나 필요하지 않은 경우 추상 팩토리를 펄로 만들려고하지 마십시오.

일부 라이브러리는 OOP 및보다 전통적인 형식으로 존재합니다. 함수 지향 또는 객체 지향 CGI 인터페이스를 사용해야합니까?를 참조하십시오 . 라이브러리를 사용할 방법을 묻는 오래된 SO 질문.


4
+1. 흥미로운 정보.이 모든 것들을 고려하여 펄을 오래된 언어로 방어 / 공격하려고하는 많은 게시물이 어떻게 생겼습니까?
user10326

2
누구나 자신이 좋아하는 언어가 있습니다. 많은 사람들은 언어가 이번 주 New Thing을 지원할 수 없다면 언어가 오래되고 구식이며 모든 것을 언어에서 옮겨야한다고 생각합니다. 다른 사람들은 특정 언어를 배우는 데 상당한 시간을 투자했으며 언어가있는 곳에서 어떻게 사용할 수 있는지 알고 있습니다. 이것은 Hot New Language만큼 빠르게 움직이지 않는 언어로 쉽게 변경됩니다. Perl은 Perl 6을 얻는 데 걸리는 시간 (언제든지 .. .. 년)에 특정 탈퇴를 겪습니다. 이것은 펄을 배우는 것을 방해해서는 안됩니다-그것은 많은 곳에서 사용됩니다.

1
펄은 리눅스 스크립팅을위한 링구아 프랑카라는 것을 알게 될 것이다. * nix 시스템에서 스크립팅을 수행 할 때 bash가 아닌 perl 스크립트를 작성하면 가장 안정적인 쉘 스크립터 만 불평합니다. 펄의 가장 중요한 것 중 하나 는 CPAN 입니다. 적당한 크기의 라이브러리를 작성하려고한다면 다른 사람이 이미 작성했는지 확인하십시오.

1
과거에는 다소 복잡한 쉘 스크립트였던 것이 이제는 종종 펄 스크립트입니다. Perl은 종종 시스템이나 응용 프로그램 사이의 접착제 / 덕트 테이프로 작동합니다. 문자열 처리는 다른 여러 산업 (특히 생물 정보학-SO의 perl 태그 내에 얼마나 많은 DNA 기반 질문이 있는지 살펴보십시오)에서 가정에서 사용했습니다.

4
Perl은 강력하고 완전한 프로그래밍 언어입니다. 스크립팅 (쉘을 포함한 다른 응용 프로그램과의 상호 작용 자동화), 유틸리티 구축 또는 대규모 응용 프로그램에 사용할 수 있습니다. 펄 증오는 펄이 밀집된 구문과 같은 것에 집중하는 경향이 있으며, 펄이 사용자에게 특정 디자인 패턴을 강요하지 않는다는 사실에 대한 오해에 초점을 맞추고있다. 나는 매일 Perl을 사용합니다. 또한 다른 언어를 자주 사용합니다. 나는 Perl의 표현력과 힘을 즐깁니다. 어색한 학습 단계를 넘어 서면 당신도 그것을 좋아할 것입니다.
DavidO

7

패러다임에 대한 Perl의 입장은 TMTOWTDI입니다 (여러 가지 방법이 있습니다). 이것이 많은 사람들이 농담으로 Perl을 쓰기 전용 언어 라고 부르는 이유 중 하나입니다 . 다른 사람의 스타일이 당신의 스타일과 완전히 다를 수 있기 때문에 그것을 읽는 것보다 작성하는 것이 훨씬 쉽습니다.

즉, OOP는 확실히 Perl에서 지원됩니다. 타사 코드를 많이 사용하는 경우 OOP 일 수도 있고 아닐 수도 있지만, 자신의 코드에 대해서는 마음의 내용에 대해 OOP를 수행 할 수 있습니다. 나는 실제로 Perl에서 OOP를 처음 배웠다. 먼저 C ++을 시도했지만 어떤 이유로 "클릭"하지 않았습니다.


1
많은 사람들이 이것이 나쁜 직업 선택이라고 생각하는 이유는 강력하고 도구 세트의 일부로 다른 언어를 보완 할 수있는 것 같습니다.
user10326

3
다른 언어가 거의 강력하고 훨씬 더 고유 한 구조를 가지고 있다고 가정 해 봅시다. 구조와 같은 회사.
Karl Bielefeldt

좋은 Perl OOP 튜토리얼을 확인하려면 codeproject.com/Articles/3152/Perl-Object-Oriented-Programming
Pmarcoen

1
Perl의 내장 OO 스타일을 설명하는 좋은 OOP 튜토리얼입니다. 이 코드가 조금 장황하다는 것을 알게되면 Perl 라이브러리 Moose에 관심이있을 수 있습니다. Perl 라이브러리는 내장 OO의 많은 반복 코딩을 자동화합니다. 그러나 내장 스타일로 시작하는 것이 가장 좋습니다 (IMH0).
matt freake

1
나는 Perl이 나쁜 커리어 옵션이라는 것을 결코 찾지 못했다. 현지 Perl Mongers 그룹을 찾으십시오. 거의 모든 회의에서 누군가 가 Perl 채용 정보를 언급 할 가능성이 있습니다.
DavidO

3

나는 같은 상황에 처해 있었고, 오랫동안 자바를 사용하고 있습니다.

Perl로 이사 한 것은 충격과 안도감 이었지만 'Perl Best Practices'라는 책을 사용했습니다. 많은 도움이되며 프로그래밍 언어의 기본 개념을 이해하면 쉽게 흐를 수 있습니다.

펄을 사용하는 방법은 여러 가지가 있다는 것을 기억하십시오. 특정 코드를보고 수정하는 데 많은 시간을 소비했지만 결국 간단한 구문 오류로 작업이 완료됩니다.


0

Perl에서 코드 재사용을 처리하는 여러 가지 방법이 있습니다. 많은 예제는 접근 방식과 다른 클래스의 차이를 명확하게 나타내지 않으며 적어도 두 가지를 사용합니다.

OO 스타일을 최대한 사용하는 것이 좋으며 상대적으로 작은 유틸리티 함수 클러스터가 필요한 클래스가 3 개 이상인 경우에만 EXPORTER를 사용하십시오.

그래서:

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;

EXPORTER함수가 x 또는 y 축에서 현재 패키지로 들어오는 것처럼 OO 접근 방식과 접근 방식을 코드 가용성의 두 가지 차원 으로 시각화하는 것을 선호합니다 .

위의 예에서 :

Foo::Barfoo()클래스 에서 메소드 를 파생시킵니다Foo

Foo::Barbar()다형성 메소드 bar()가 클래스에서 파생되지 않도록 메소드를 정의합니다.Foo

클래스 둘 FooFoo::Bar수신 EXPORTED기능 ( 하지 방법 ) util()패키지 (에서 하지 클래스 )Foo::Util

두 시스템은 복잡해 보이지만 매우 실용적인 유틸리티입니다. 여러 상속을 추적하면 까다로울 수 있습니다. 따라서 코드 가용성의 두 번째 차원을 가지면 상속 트리를 작고 관리하기 쉽게 유지할 수 있습니다.

일반적으로 함수가 모 놀리 식이고 상대적으로 멍청한 경우 EXPORTER를 사용하고, 그렇지 않으면 상속을 사용하십시오. 그러나 할 EXPORTER일이 3 개 또는 4 개가 넘는 패키지를 포함하지 않는 한 전혀 사용하지 않아도 됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.