산디 메츠가 피퍼라면
개시하다
이 기사는 관계자 Advent Calendar 2017의 14일째 신청이다.
안녕하세요!관계자주식회사의 서버 엔지니어@itosho입니다.
저는 예전에 회사의 Tec Blog에 DHH씨가 CakePHP 컨트롤러를 썼다면...라는 기사를 썼는데 평소에 루비에게서 배운 기술과 사고방식을 PHP에 적용하는 버릇이 있어서 오늘은 이런 망상 시리즈의 2탄을 들려드리겠습니다.
Sandi Metz 규칙이란?
갑작스럽지만 샌디 메츠 룰을 아시나요?
이 규칙은 《대상을 대상으로 하는 디자인 실천 지침~루비를 통해 끊임없이 진화하는 유연한 응용의 육성 방법을 이해한다》의 유명한 작가 산디 메츠가 읽은 루비로 예쁜 디자인의 규칙을 파악하기 위한 것으로 많은 사람들이 알고 있을 것이다.
다음 4가지 지켜야 할 규칙을 구체적으로 열거했다.
그래서 오늘은 이 Sandi Metz 규칙의 PHP 버전을 고려해 보려고 합니다.
각 규칙에 대한 고찰
규칙 1.클래스 내의 코드는 100줄 이하이다
우선, 이 규칙의 장점은 단일 책임의 원칙을 철저히 관철하는 것이다.Rubby와 마찬가지로 (현재) 대상을 향한 언어 PHP라도 이 규칙은 충분히 적용될 수 있다.
다만, 이 100의 숫자 PHP도 적합합니까?
루비와 PHP는 문법과 표현력이 다르기 때문에 PHP라면 임계값이 좀 더 길다(또는 짧다)가 좋다.
이에 따라'측정을 추측하지 말라'는 정신 아래 루비/레일즈제의 대표적인 오픈 소프트웨어Redmine와 복제된 PHP/CakePHP제CandyCane의 컨트롤러 파일을 비교했다.1
항목
Redmine
CandyCane
파일 수
50
35
총행수
7421
8152
평균 행수
148
232
측정 방법: 2
그 결과 PHP는 루비보다 1.57배 길었다.
따라서 PHP는 100 행이 아니라 150 행의 임계값입니다.
규칙 2.방법 내의 코드는 5줄 이하이다
소류와 마찬가지로 작은 방법은 가독성이 낮아지고 변수의 작용 범위가 길어지기 때문에 단축 방법의 장점이 크다.
또 세밀한 처리를 사적인 방법으로 함으로써 처리에 이름을 붙이는 것도 장점이다.
그러면 우리도 Redmine과 Candy Cane으로 5라는 한도값이 PHP에 적합한지 비교해 봅시다.
항목
Redmine
CandyCane
방법수
17
20
총행수
492
737
평균 행수
29
37
측정 방법: 3
그 결과 PHP는 루비보다 1.27배 길었다.
그래서 나는 우리의 규칙이 5줄이 아니라 6줄이 한도값이라고 생각한다.
규칙 3.방법 매개 변수는 4개 이하이다
이 규칙은 규칙 2이다.만약 철저하게 할 수 있다면 어느 정도는 자연스럽게 보호할 수 있으나 파라미터가 많은 방법의 용도가 명확하지 않은 경우가 많다.
그리고 파라미터가 많지만 실제로 호출할 때 지정할 필요가 없는 파라미터가 많은데 이런 방법을 사용하면 긴밀하게 결합되기 때문에 이 규칙을 준수하는 장점은 PHP도 누릴 수 있다는 것이다.
또한 산열(연상 배열)의 옵션도 매개 변수로 계산하면 규칙에 명확하게 기재되어 있기 때문에 대량의 옵션을 설정할 수 있는 배열의 매개 변수도 없앨 수 있다.
또한 4라는 임계값"인터페이스 디자인 심리학 - 인터넷과 응용에 새로운 시각을 제공하는 100개의 지침"에 관해서는'사람이 어떻게 저장되는가'라는 장에서
한 번에 4개밖에 못 외워요.
이런 기술이 있기 때문에, 나는 그렇게 이쪽의 규칙을 채택하고 싶다.
규칙컨트롤러에 실례 변수가 있습니다
이 규칙은 Ruby/Rails 특유의 생각으로 PHP에 직접 적용할 수 없지만 기본적으로 컨트롤러와 보기의 교환을 간단하게 하는 것이 목적이다.
CakePHP를 사용하면 컨트롤러는 보기에 설정된 변수를 1개로 설정합니다.
물론 대시보드 등 다양한 정보(대상)를 표시해야 하는 화면은 간단한 방법으로는 이 같은 규칙을 지키기 어렵다.
이 경우 페이케이드 모드를 사용해 다양한 정보가 담긴 대시보드 객체를 뷰에 전달하는 것이 이 규칙을 지키는 노하우다.
참조실제 코드하면 인상을 남기기 쉬울 수도 있습니다.
또 기존 보도된 TheoughtWorks(마틴 파울러 재적으로 유명한 회사)에서는 뷰에 제공하지 않는 기록은 실례 변수를 예외로 prefix
_
를 사용했다.따라서 우리의 규칙과 PHP는 충분히 실현할 수 있기 때문에 그렇게 채택하고 싶습니다.
PHP Edition Sandi Metz 규칙
정리하면 이런 느낌!
방법 매개 변수는 4개 이하이다
컨트롤러는 하나의 실례 변수 대상만 허용한다
규칙 0
사실 Sandi Metz 규칙에는 또 하나의 규칙이 있는데, 규칙은 0이다.
특히 규칙 3.Rails와 CakePHP의 어시스턴트 방법을 쓰면 워낙 어려운 게 많아요, 룰 2.규격에 따라 아무리 노력해도 지키기 힘든 경우도 많다고 생각해서 개인적으로 좋은 규칙이고 균형감각이 강하다고 생각해요.
끝말
총결산
물론 규칙별 임계값이 적절한지에 대한 논의도 있었고, 워낙 메이저리그 육성 깁스식 규칙이어서 실제 개발 현장에서 스트리트를 지키기는 어려울 수 있다.
그러나 이 규칙을 조금만 주의하면 코드의 질이 완전히 다르기 때문에 PHP도 이 규칙을 채택할 것입니다. 예쁜 코드만 조금 써도 앞으로 사용자에게 가치 있는 서비스를 제공할 것입니다!
참고로 Sandi Metz 규칙을 선교할 때 서버 측 엔지니어의 파트너가 슬랙으로 이런 알림을 설정해 주었다
내일의 예고
내일(15일째)의관계자 Advent Calendar 2017는 관계인이 자랑스러워하는 안드로이드 엔지니어@tommykw의 뒤돌아보기!기대해주세요!
문헌 목록 / 사이트
행 수는 주석을 제외한 코드 행 수입니다.CandyCane의 Component 디렉토리는 각 컨트롤러 디렉토리에 있는 파일을 대상으로 합니다. ↩
어느 창고든 줄 수가 가장 긴 컨트롤러 클래스
IssuesController
클래스 내의 방법을 대상으로 한다.모든 컨트롤러 종류의 방법을 대상으로 하려고 했지만 간단한 측정 도구를 찾지 못했는데... ↩ Reference
이 문제에 관하여(산디 메츠가 피퍼라면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/itosho/items/0dde8176b36e59b3c0ef텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)