php - 소켓 - 리 액트 백엔드



PHP로 서비스 레이어 클래스 디자인하기 (1)

최근 Jani Hartikainen 이 MVC 응용 프로그램에서 양식 데이터를 최상으로 처리하는 방법에 대한 토론에서 서비스 계층을 소개 했습니다. 몇 가지 독서를 한 후에이 접근 방식의 이점을 실제로 볼 수 있습니다. 내 질문은 이것이다 :

서비스 클래스는 어떻게 구성되어야합니까?

  • 첫째로, user_service() 는 내 user() 모델에 대한 적절한 클래스 이름인가, 또 다른 표준인가?
  • 내 서비스의 메소드는 하나의 태스크 만 수행하므로 항상 static function 될 수 있다고 생각하는 것이 맞습니까? 서비스 클래스는 데이터를 나타내는 것이 아니라 일련의 액션입니다. 따라서 적절할 것입니다.
  • 서비스 메소드는 하나의 argument 만 허용해야합니까? 이는 array 될까요?

양식이 사용자 데이터를 저장하기 위해 컨트롤러에 데이터를 게시했다고 가정합니다.

<?php

    class form_controller extends controller
    {

        public function process_submit()
        {
            if(user_service::update_preferences($_POST))
            {

                echo json_encode(array('success' => true));
            }
            else
            {
                echo json_encode(array('success' => false));
            }
        }

    }

    class user_service
    {

        // Accepts array()
        public static function update_preferences($fields)
        {

            // Check for required fields
            if((
                isset($fields['firstname']) and
                isset($fields['lastname']) and
                isset($fields['email'])
                ) == false
            {
                return false;
            }

            // Update user
            try
            {
                $s = new user();
                $s->set_firstname($fields['firstname']);
                $s->set_lastname($fields['lastname']);
                $s->set_email($fields['email']);
                $s->update();

                return true;
            }
            catch(Exception $e)
            {
                return false;
            }
        }
    }

나는 이것이 좋은 접근이라고 느낀다. 왜냐하면 :

  • 내 양식에 다른 필드를 추가 할 수 있으므로 controller 만 업데이트하면 controller . 컨트롤러가 전달되는 데이터가 무엇인지에 대해 염려해서는 안되며 전달되는 것입니다. 이것은 내 컨트롤러를 작게 유지하고 내 모델의 논리를 유지합니다.
  • array 전달하지 않으면 여러 인수를 사용하여 함수를 설정할 수 있습니다. 예를 들어 내 함수는 update_preferences($firstname, $lastname, $email) 있습니다. 그러나 이것은 20 개 이상의 인수가있는 함수 (큰 폼의 경우)를 만들 수 있으며, 순서는 작업하기에 끔찍할 것입니다.
  • 나는 object 통과시킬 수는 있지만 그것이 의미가있는 것인가? 내가 객체를 만들면, 그것이 나타내는 객체 (이 경우 사용자)가 맞아야합니까? 하지만 컨트롤러가 사용자 객체를 인스턴스화하는 것이 합리적입니까? 처음에는 서비스 계층의 핵심이 아닌가?
  • 어쩌면 인수가 여러 개인 메소드 (한 개에서 세 개까지있을 때)와 배열을 허용하는 메소드 (필드가 많은 경우)가있을 ​​수 있습니다. 이것은 마치 특정 방법이 무엇을 요구했는지 알기 위해 클래스를 참조해야하므로 악몽처럼 느껴질 수 있습니다.

누구나 할 일이 옳은지에 대한 의견이 있습니까? 나는 올바른 길을 가고 있는가? 과거에 당신은 무엇을 했습니까? 고마워요!


나에게 이메일을 보내는 것까지 갔으니 까?

첫째로, user_service ()는 내 user () 모델에 대한 적절한 클래스 이름인가, 또 다른 표준인가?

그건 괜찮아. 그러나 PEAR 또는 ZF 규칙과 같이 설정된 PHP 코딩 규칙 중 하나를 사용해야합니다. 두 경우 모두 클래스 이름은 UpperCamelCase 이고 메소드 이름은 lowerCamelCase 입니다. 이 클래스를 사용하면 클래스는 UserUserService

내 서비스의 메소드는 하나의 태스크 만 수행하므로 항상 정적 함수가 될 수 있다고 생각하는 것이 맞습니까? 서비스 클래스는 데이터를 나타내는 것이 아니라 일련의 액션입니다. 따라서 적절할 것입니다.

아니요. 메소드를 정적으로 만드는 것은 좋지 않은 디자인 선택입니다. 이는 서비스뿐 아니라 대부분의 코드에도 적용됩니다. 서비스의 주된 이유 중 하나는 일반적으로 서비스가 데이터 저장소 또는 데이터 계층 (저장소, 데이터 액세스 개체 등)을 나타내는 다른 클래스와 상호 작용해야한다는 것입니다.

서비스에 정적 메서드가 있으면 메서드에 종속성을 추가해야 할 필요가 있음을 의미합니다. 즉, 다른 것들 중에서도 코드를 쉽게 테스트 할 수 없게됩니다. 의존성을 쉽게 대체 할 수 없기 때문입니다.

예를 들어 here 대한 좋은 읽을 거리가 here (실제로 블로그의 거의 모든 것이 소프트웨어 개발자에게 좋은 읽을 거리입니다)

서비스 메소드는 하나의 인수 만 허용해야합니까? 이는 배열이 될까요?

이는 메소드가 수행하는 작업에 따라 다릅니다. 양식의 결과 집합을 처리하는 예를 가정하면 예, 아마도 작동 할 것입니다. 다른 경우에는 좋지 않은 선택 일 수 있습니다.

내 양식에 다른 필드를 추가 할 수 있으므로 컨트롤러 만 업데이트하면됩니다. [...]

배열을 전달하지 않으면 여러 인수를 사용하여 함수를 설정할 수 있습니다. [...]

네,이 두 가지 사례에 대한 당신의 논쟁은 제 의견으로는이 유스 케이스에 꽤 많이 자리 잡고 있습니다.

나는 물체를 통과시킬 수는 있지만 그것이 의미가있는 것인가? 내가 객체를 만들면, 그것이 나타내는 객체 (이 경우 사용자)가 맞아야합니까? 하지만 컨트롤러가 사용자 객체를 인스턴스화하는 것이 합리적입니까? 처음에는 서비스 계층의 핵심이 아닌가?

이것은 다릅니다. 예를 들어, 폼을 객체로 표현할 수있는 프레임 워크 (예 : Zend Framework 및 Zend_Form )를 사용하는 경우 양식 객체를 서비스로 직접 전달할 수 있습니다.

어쩌면 인수가 여러 개인 메소드 (한 개에서 세 개까지있을 때)와 배열을 허용하는 메소드 (필드가 많은 경우)가있을 ​​수 있습니다. 이것은 마치 특정 방법이 무엇을 요구했는지 알기 위해 클래스를 참조해야하므로 악몽처럼 느껴질 수 있습니다.

일반적으로 메소드의 이름을 기반으로 매개 변수를 최소한 반쯤 추측 할 수 있도록해야합니다. 내가하는 일에서 우리는 예를 들어 비즈니스와 제품이있는 모델을 가지고 있습니다. 비즈니스가 제품을 후원 할 수있는 곳입니다. ProductService 에는 비즈니스와 제품을 매개 변수로 사용하는 sponsorProduct 라는 메서드가 있습니다. 꽤 많이 추측 할 수 있습니다. (코드베이스에 익숙하다면)

IDE는 일반적으로이 기능을 지원합니다. params 함수가 사용하는 코드를 표시하는 코드 지원 기능을 제공합니다. 이것은 IDE가 특정 프로젝트에서 매개 변수로 필요한 것을 정확히 기억할 수없는 대규모 프로젝트에서 매우 유용하다고 생각하는 주된 이유 중 하나입니다.

매개 변수 개수에 관해서는 일반적으로 별도의 매개 변수가 있어야한다고 생각합니다. 이를 통해 누구나 함수의 서명을보고 필요한 매개 변수를 쉽게 볼 수 있으며 유형 힌트와 기본값을 쉽게 쉽게 정의 할 수 있습니다.

그러나 너무 많은 매개 변수를 얻는 것이 너무 많습니다. 이것은 +5 정도일 수 있습니다. 어떤 종류의 메소드인지에 따라 조금씩 다릅니다. 이 경우 배열이나 매개 변수 개체라는 것을 사용할 수 있습니다.이 개체는 본질적으로 호출의 모든 매개 변수를 포함하는 개체입니다. 매개 변수 객체에 대한 자세한 내용은 here





service-layer