테마에서 OOP 사용


36

실제로 필요하지 않은 경우 객체 지향 코딩을 사용하는 많은 플러그인이 있습니다.

그러나 더 나쁜 것은 테마 개발자가 같은 일을 시작한다는 것입니다. 상업 테마와 Suffusion과 같은 무료 인기 테마, 심지어 내가 가장 좋아하는 테마-Hybrid도 클래스 내에서 모든 함수를 채우고 functions.php에서 한 번 인스턴스화하고 절차 방식으로 함수를 실행합니다. :)

이런 씨발? 이 작업의 요점은 무엇입니까? 분명히 동일한 테마의 둘 이상의 인스턴스를 동시에 사용하지 않을 것입니다.

플러그인이 네임 스페이스 (이것이 우스운 일)에 대해이 작업을 수행한다고 가정 해 봅시다.하지만 테마 변명은 무엇입니까? 뭔가 빠졌습니까?

이와 같은 테마를 코딩하면 어떤 이점이 있습니까?


5
@Ambitious Amoeba-네임 스페이스 충돌을 최소화하기 위해 플러그인 클래스를 사용하는 것이 어리 석다고 믿는 이유를 설명 할 수 있습니까? 테마에 관해서는 테마에서 좋은 코드로 간주하는 것과 불필요하다고 생각하는 것에 대한 예를들 수 있다면 도움이 될 것입니다. 초록에서 이것을 논의한다고해서 당신이나 다른 사람들, 특히 당신이 말하는 것에 익숙하지 않은 다른 사람들에 대한 통찰력을 얻지는 못할 것입니다.
MikeSchinkel

1
개인적으로 할 수있는 곳에서 수업을 사용하기 때문에 유지 관리, 업데이트 및 재사용이 훨씬 쉽습니다. 개인 취향 외에, 수업을 사용하는 데에는 어떤 좋은 이유가 있습니까?
t31os

1
홀수, 방금 원래 의견을 잃어 버렸습니다 (SE 버그일까요?). 나는 그것을 반복 할 것입니다 . 클래스를 사용 하지 않는 좋은 이유는 무엇 입니까?
t31os

2
@ MikeSchinkel : 함수 이름에 접두사를 추가하면됩니다. 멋진 함수 이름을 갖는 것만으로 추가 클래스 오버 헤드의 가치가 있다고 생각하지 않습니다. 어쨌든, 난 많이 플러그인에 대한하지 그, 테마 이렇게하는 이유에 대해 궁금 해서요
onetrickpony

4
@Ambitious Amoeba-나는 당신이 당신의 의견에 대한 권리를 가지고 있다고 분명히 말할 것이지만, 나의 의견은 다릅니다. 글로벌 네임 스페이스에 떠 다니는 함수를 최소화하여 클래스가 코드를 작성하는 선명도는 특히 PhpStorm과 같은 전문 수준의 IDE를 사용할 때 효과적으로 측정 할 수없는 추가 오버 헤드가 될만한 가치가 있다고 생각합니다. 또한 클래스는 독립적 인 단위를 만들어 개발자가 모듈에 필요한 코드를 알 수 있도록합니다. 마지막으로 클래스를 사용하기 위해 WordPress 플러그인 스타일을 발전시킨 후에 다른 방법은 나쁘게 코딩하는 것처럼 느낍니다.
MikeSchinkel

답변:


26

귀하가 제공 한 예에 근거하여 귀하의 혼란을 이해할 수 있습니다. 그것은 클래스를 사용하는 나쁜 방법입니다 ... 그리고 클래스가 사용되기 때문에 시스템 OOP를 만들지 않습니다.

하이브리드의 경우 클래스를 사용하여 함수의 네임 스페이스를 사용합니다. 하이브리드를 테마 프레임 워크로 간주 하면 개발자가 이름 충돌에 대해 걱정할 필요없이 자식 테마가 함수 이름을 재사용 할 수 있습니다. 많은 경우, 테마 프레임 워크 (부모 테마)는 너무 복잡하여 많은 하위 테마 개발자는 정확히 어떤 일이 일어나고 있는지 이해하지 못합니다.

하이브리드가 클래스 구조를 사용하지 않으면 하위 테마 개발자는 기존 함수 호출이 무엇인지 알고 있어야 이름 재사용을 피할 수 있습니다. 예, 모든 함수 앞에 고유 한 슬러그를 붙일 수는 있지만, 동일한 기능을 사용하려는 추가 시스템을 개발하는 경우 코드를 읽기 어렵고 유지하기가 어렵고 본질적으로 재사용 할 수 없습니다.

질문에 대답하려면

이런 씨발? 이 작업의 요점은 무엇입니까? 분명히 동일한 테마의 둘 이상의 인스턴스를 동시에 사용하지 않을 것입니다.

아니요, 동일한 테마의 둘 이상의 인스턴스를 사용하지 않습니다. 그러나 내가 말했듯 이이 경우 클래스 구조 는 전통적인 객체 인스턴스를 생성하지 않고 함수의 이름을 지정 하는 것으로 생각하십시오 . 클래스에서 모든 것을 함께 모아서 메소드를 호출 ( myClass->method();)하거나 메소드를 직접 호출 ( ) 하도록 인스턴스화하는 myClass::method();것은 읽기 쉽고 재사용 가능한 방식으로 네임 스페이스를 작성하는 매우 깨끗한 방법입니다.

물론 항상 myClass_method();대신 비슷한 것을 사용할 수 있지만 다른 테마, 플러그인 또는 다른 프레임 워크 에서이 코드를 재사용하려면 모든 접두사를 다시 바꿔야합니다. 수업 시간에 모든 것을 깨끗하게 유지하면 훨씬 빨리 재개발하고 재배치 할 수 있습니다.

플러그인이 네임 스페이스 (이것이 우스운 일)에 대해이 작업을 수행한다고 가정 해 봅시다.하지만 테마 변명은 무엇입니까? 뭔가 빠졌습니까?

대부분의 상황에서 나는 당신에게 동의 할 것입니다. 그러나 그 대다수는 빠르게 쇠퇴하고 있습니다. 동일한 테마의 변형을 사용하는 MultiSite 설치에서 여러 사이트를 호스팅합니다. 사소한 차이로 동일한 테마를 반복해서 재생성하는 대신 부모 테마에 대한 단일 "클래스"가 있으며 모든 하위 테마가 해당 클래스를 확장합니다. 이를 통해 각 사이트에 대한 사용자 정의 기능을 정의하면서도 전체 네트워크에서 균일 성을 유지합니다.

한편으로 테마 개발자는 자신의 기능을 네임 스페이스로하는 클래스 기반 접근 방식을 선택할 수 있습니다 (동일한 코드의 청크를 반복해서 재사용하는 환경에서 작업하는 경우에는 우스운 일이 아닙니다). 반면에 테마 개발자는 하위 테마별로 쉽게 확장 할 수있는 클래스 기반 접근 방식을 선택할 수 있습니다.

이와 같은 테마를 코딩하면 어떤 이점이 있습니까?

사이트에서 하이브리드 만 사용하는 경우 최종 사용자로서의 이점을 거의 알 수 없습니다. 하이브리드에 대한 하위 테마를 작성하는 경우 이름 지정 및 확장 성의 이점이 있습니다. ThemeHybrid 에서 작업하는 경우 다른 프로젝트 (프로토 타입, Leviathan 등)에서 빠르고 효율적인 코드 재사용이 장점입니다.

그리고 하이브리드의 특정 기능을 좋아하지만 전체 테마가 아닌 테마 개발자라면 하이브리드가 아닌 프로젝트에서 GPL이라고 가정 할 때 빠르고 효율적인 코드 재사용이 장점입니다.


"확장 성"부분에 동의하지 않습니다. 조치 및 일반 기능을 사용한 경우와 동일한 상위 테마 제어 레벨이 있습니다. 왜? 당신은 스스로 그것을 말했다, 이것은 사실 OOP가 아닙니다. 나는 네임 스페이스 링에 동의하지 않습니다-이것이 내가 처음 에이 질문을 시작한 이유입니다-플러그인에서 Hybrid의 함수를 재정의하면 함수가 충돌한다는 것을 알 수 있습니다. 왜 여전히 접두사를 추가했다고 생각하십니까? :) 당신은 수업에서 전체 테마를 감쌀 수없고, 그것은 말이되지 않습니다 ...
onetrickpony

나는 여기서 일부 사람들이 이해할 수 있듯이 테마에서 OOP를 사용하지 말라고 말하지는 않지만 (예 : 워커 등 2.8 위젯 참조) 그렇지는 않습니다.
onetrickpony

1
테마에서 OOP를 사용하거나 테마를 사용하여 정의 된 함수의 네임 스페이스를 작성하는 클래스가 아니라 하이브리드의 특정 구현에 문제가있는 것 같습니다. 나는 당신의 더 넓은 질문에 대답하려고 노력했습니다. 그리고 다시 :이 작업의 장점은 무엇입니까? 나는 반쯤 구현 된 것으로 보이는 것을 방어하거나 특정 테마 프레임 워크의 구조에 대한 당신의 명백한 적대감을 반대하는 데 시간을 소비하지 않을 것입니다. 결론적으로, 하이브리드의 빌드 방식이 마음에 들지 않으면 다른 것을 사용하십시오.
EAMann

1
전혀, 나는 하이브리드를 좋아하지만 (물론 수업은 아닙니다). 하이브리드는 나만의 테마 프레임 워크를 만들도록 격려했다. 동일한 유형의 연습 인 또 다른 예인 Suffusion을 보자. 이 경우에도 네임 스페이스는 테마와 작동하지 않습니다. 래퍼 클래스 내의 모든 함수는 플러그인이 WP "내부"테마에 의해로드되므로 항상 플러그인과 충돌합니다.
onetrickpony

1
그럴 수 있지. 대부분의 WP 작업은 시작하기에 OOP가 아니며 (WP가 아니기 때문에) 테마 메소드를 클래스에 배치하여 플러그인에서 수행되는 방식을 모방하는 것은 적어도 오른쪽 단계입니다. 방향은 반 잉태되고 제대로 구현되지 않은 수업이라도. 클래스의 모든 것을 래핑하고 절차 적으로 호출하는 것이 약간 이상하다는 점에 동의합니다 (시스템을 사용하려는 타사 개발자의 POV에서는 유용하지 않음). 그러나 올바르게 수행하면 (그리고 하이브리드에서는 그렇지 않습니다) 코드를 클래스 화하는 functions.php것이 매우 강력 할 수 있습니다.
EAMann

29

속도

내 현재 기본 테마에는 13 개의 수업이 있습니다. 새로운 테마를 만들 때 이러한 클래스를 그대로 사용하거나 확장합니다. 이 시스템은 새로운 테마를 만드는 과정을 매우 빠르고 매우 빠르게 만듭니다.

단단한 범위

내 코드가 알아야 할 모든 것이 클래스 멤버에 숨겨져 있기 때문에 전역 변수가 거의 필요하지 않습니다. 따라서 플러그인이 잘못 작성된 두 가지 매우 다른 필터 또는 작업간에 변수를 공유 할 수 있습니다.

정비

각 클래스는 하나의 파일입니다. 클라이언트 테마를 업데이트해야하는 경우 일부 파일 만 업데이트합니다. 동일한 API를 제공하는 한 클래스 내에서 일어나는 일은 나에게 달려 있습니다.

예를 들어, comment_form();전화 위에 간단한 조치를 사용합니다.

do_action( 'load_comment_class' );
comment_form();

어떤 주석 클래스가로드 될지 내 컨트롤러를 결정합니다. 주석 클래스 내에서 정확히 어떤 일이 발생 하는지에 따라 개별 클래스가 결정됩니다.

순수한 절차 적 접근 방식으로 시도해보십시오. :)

가독성

몇 달 후 작업으로 모든 것을 분리하면 자신의 코드 를 다시 읽고 이해 하는 것이 훨씬 쉽습니다 .

유용한 클래스 계층에 대한 몇 가지 예

  • Meta_Box-> 확장 Shortdesc_Meta_BoxSimple_Checkbox_Meta_Box-> 확장Sidebar_Switch
  • User_Profile_Addon-> 확장 User_Profile_Checkbox( 질문 3255 참조 )
  • Comment_Form -> 확장 {$theme_name}_Comment_Form

1
'테마'수업을받을 기회가 있습니까? 나는 내 자신을 쓰고 싶어요 그리고 당신이 어떻게하는지 알고 싶습니다.
Horttcore

1
아직 결정하지 않았습니다. 내년에는 @bueltge와 함께 새로운 기본 테마를 내년에 사용하고 있습니다. 행진하기 전에는 아마 두렵습니다.
fuxia

5
특히 귀하의 경우, 자유 테마 및 프레임 워크의 경우 OOP가 갈 길입니다. 다른 사람들은이 코드를 사용해야합니다. 저자는이 과정을 가능한 한 쉽고 유연하게해야합니다. 잘 작성된 클래스에는 API가 명확하게 정의되어 있으므로 클래스를 바꾸는 것이 20 개의 함수를 바꾸는 것보다 쉽습니다.
fuxia

2
하이브리드에 대해서는 아무 것도 말할 수 없습니다. 나는 그것을 사용한 적이 없다. 하지만, 그래, 커튼, 이벤트 좋은 필터 삽입 뒤에 모든 것을 구성하는 컨트롤러 몇 가지 일반적인 테마 엉망으로 MVC 패턴 - 좋은 것입니다. 날 믿지마 시도 해봐. :)
fuxia

3
이제 워드 프레스는 개발자를위한 OOP 테마가 필요하다. 목표 달성을 위해 시간을 내 주길 바랍니다. 이 작은 발췌문과 이점은 고객 테마에 대한 oop의 큰 가능성을 보여줍니다. 새로운 테마를 실현하는 빠른 방법은 유지 관리에도 좋습니다.
bueltge

3

고려해야 할 또 다른 사항 : 속도.

if ( !class_exists('cccYourClassName') )  
// VERSUS  
if ( !function_exists('ccc_your_function_name') )

짧은 모양 / 인쇄 후 ~ 1.700 내부 기능과 ~ 1.400 사용자 기능 = ~ 3.100 / 3.200 기능 VS를 찾았습니다. ~ 250 수업. 나는 이것이 룩업에 얼마나 필요한지에 대해 가장 많이 말한다고 생각합니다. !function_exists('')테마에 약 50-100 개의 함수가 필요하다면 타이머를 설정하고 수학을 시작하십시오. OOP가 아니더라도 코드를 만드는 좋은 방법입니다.

1) 재사용 가능
2) 유지 보수 가능
3) 교환 가능
4) 약간 빠름

메타 상자, 위젯 등을 빠르게 수행하는 데 도움이되는 웹에서 떠 다니는 다른 클래스를 살펴보면 @toscho와 같은 컨트롤러를 사용하는 것이 좋습니다. 클래스를 처리하는 컨트롤러의 일부 줄.


2

어떤 사람들은 캡슐화가 OOP가 제공하는 유일한 (또는 최소한 1 차적인) 이익이며, 상속과 상태는 지루하고 악한 것 사이에 있다고 주장합니다.

http://obiecte.blogspot.com/2008/09/oop-sucks.html

저자는 정적 함수의 컨테이너가 아닌 구조체로 클래스 / 객체를 사용하는 것에 대해 더 많이 이야기하고 있지만 OOP 캠프 외부에있는 사람과는 완전히 다른 질문을 읽는 것이 흥미 롭습니다.

Haskell에서 다음 WordPress 플러그인을 작성할 수 있습니다.


1
불행히도 "초청 된"사용자에게만 블로그가 열립니다. 왜 우리가 무료 서비스에 정보를 게시해서는 안되는지, 왜 우리 자신의 블로그를 호스팅해야하는지 상기시켜줍니다. 이와 관련하여 Facebook은 거의 동일합니다. 업데이트 된 리소스 링크가 좋을 것입니다. FWIW 나는 OOP의 어두운면을 보았고 컨텍스트 내에서 절대적으로 필요한 경우가 아니라면 절대로 다시 사용하지 않을 것입니다. 고차 함수는 일반적으로 기능을 확장 하고 class키워드 및 상용구 사용을 줄일 수 있기 때문 입니다.
Josh Habdas

2

아 꽤 토론! 캡슐화를 위해 클래스를 사용하는 것보다 훨씬 더 자주 사용한다는 것을 인정해야합니다. 내 플러그인에서 내 함수를 클래스로 래핑 할 수 있고 그 클래스 내에서 내가 작성한 다른 플러그인 중에서도 매우 간단하고 의미있는 메소드 이름을 사용한다는 아이디어가 있습니다. 이 경우 클래스는 네임 스페이스를 대체하며 5.2.x 환경에서는 피해야합니다.

OOP가 모듈화에 유용한 경우는 거의 없지만 함수를 래핑하는 간단한 동작으로 인해 플러그인 간 확장 성이 추가로 향상됩니다. 예를 들어, 최근에는 클래스 기반 인보이스 솔루션을 확장했으며 확장 클래스를 내부화하지 않고 메인 클래스를 확장하거나 다양한 함수 (w / parent :: calls)에 코드를 추가하거나 함수를 대체 할 수있었습니다.

그럼에도 불구하고 대부분의 클래스 래핑은 네임 스페이스를 대체 할뿐입니다.


-4

작성하지 않은 코드에 대해 불평하는 요점은 무엇입니까?

코드가 마음에 들지 않으면 직접 작성하십시오!

단순한. 문제 해결됨.

프로그래머는 자신의 길을 좋아합니다. 따라서 코드 작성 방법, 마시는 위스키 종류, 담배를 피우는 담배 브랜드 또는 따라야 할 종교를 말할 수 있다고 가정하지 마십시오. 그들은 그러한 당뇨병을 디버깅하고 원하는 일을 계속할 것입니다. ;-)

코드는 시가 아닙니다. 코드는 Sinatra 노래 "My Way"의 변형입니다 ...


10
이 질문은 코드에 대해 불평하지 않고 코드가 특정 방식으로 작성된 이유 에 대한 명확한 설명을 요구합니다 . WP 코어의 대부분은 절차 적이며 OOP 접근 방식을 사용하는 몇 가지 새로운 기능이 있습니다. 많은 최신 플러그인도 OOP를 사용하여 기능을 캡슐화합니다. 그러나 대부분의 테마는 그렇지 않습니다. OP는 의사 -OOP 접근 방식이 왜 사용되는지 묻고 하이브리드를 예로 들었습니다. 당신은 질문에 대답하지 않고 있습니다.
EAMann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.