프로젝트 및 개발 RESTful을 위한 의존성 웹 응용 프로그램 주입

11717 단어 PHPBEAR.Sunday
며칠 전에 본사는 베어에 있었습니다.선데이라는 웹 응용 프레임워크를 개발한 군산 소인 씨의 베어.선데이에 대한 강연을 했습니다.

여기 기사에서 그 연설을 바탕으로 한 베어.선데이의 간 부분인 DI, AOP, Resource를 소개하고 싶습니다.
일단 베어.선데이란 레이를 뜻한다.Di、Ray.Aop、BEAR.Resource는 세 개의 객체 프레임으로 구성됩니다.
관전 포인트를 보면 DI(의존적 주입), AOP(종횡 방향 프로그래밍), 리소스(REST 자원) 등의 특징을 지닌 프레임임을 알 수 있다.

DI(의존성 주입)


우선 DI는 Dependency Injection(의존성 주입)이다.
사물에는 반드시 원리·원칙이 있지만, 이 DI에도 원칙이 있다. DIP(Dependency Inversion Principle).
DIP는 다음과 같습니다.
  • 코드(클래스)는 그것과 동일하거나 더 높은 추상에 의존해야 한다.
  • 높은 수준의 정책은 낮은 수준의 세부 사항에 의존해서는 안 된다.
  • 이런 상황에서 의존성은 클래스에 고정된 상수, 변수, 실례를 포함하고
    의지하다
    이렇게 의존이 야기하는 문제는 다음과 같은 몇 가지가 있다
  • 수치와 실례가 고정되어 있어 테스트 시 변경하기 어렵다
  • 유연성이 없어 쉽게 사용자 정의할 수 없음
  • 이 같은 문제를 해결하기 위해 외부로부터 의존성을 주입하겠다는 생각이 들었다.
    그걸 설치한 건 레이야.디가 되다.
    그럼 실제 간단한 코드를 보고 의존성을 어떻게 주입하는지 봅시다.
    1. @Inject를 주입 방법에 제출
    구조기는 편성할 필요가 없다.
    /**
     * @Inject
     */
     public function __construct(RenderInterface $renderer)
     {
     ....
    
    2. 의존해야 할 곳에 어떻게 의존하는지 설명한다.
    class RendererModule extend AbstractModule
    {
        protected function configure()
        {
            $this->bind('RendererInterface')
                ->to('HalRenderer')
                ->in(Scope::SINGLETON);
    }
    
    3. 분사기 제작
    $injector = Inject::create([new RendererModule]);
    $user = $injector->getInstance('UserInterface');
    
    모듈로 만든 주사기는 어떤 의존이 있어야 무엇을 전달할 수 있는지 안다.이 주사기를 사용해 UserInterface 클래스를 얻으면 주사기는 모듈에 의해 결정된 규칙에 따라 교부하는 데 필요한 의존성을 가지고 의존적으로 해결된다.
    고정된 실례가 없기 때문에 테스트할 때도 쉽게 변경할 수 있다.

    AOP(넓은 높이를 위한 프로그래밍)


    한마디로 AOP은'가로로 뻗은 관심을 핵심 관심사에서 나누는 것'이다.
    여기서 말하는 핵심 취미는 비즈니스 논리로 횡단적인 취미가 넓어지는 것이다.
    우선 아래 코드를 보십시오.
    class Post extends AppModel {
    
        public function newest(){
            $result = Cache::read('newest_posts', 'longterm');
            if(!$result){
                $result = $this->find('all');
                Cache::write('newest_posts', $result, 'longterm');
            }
            return $result;
        }
    
        /**
         * @Cache
         */
         public function onGet($id)
         {
            // ...
            $this->body = $stmt->fetchAll(PDO::FETCH_ASSOC);
            return $this;
         }
    }
    
    위 코드와 같이 캐시 관리와 onGet의 동작이 혼합되어 있습니다.이것은 상업 논리와 응용 프로그램 논리가 혼합되어 있다는 것을 의미한다.
    관심을 잘 나누지 못해서 시험도 어렵고 읽기도 어렵고 팩스도 어렵고 이런 문제가 나왔어요.
    그렇다면 어떻게 해야만 상술한 코드를 더욱 좋게 할 수 있습니까?
    좋아진다는 것은 테스트하기 쉽고 읽기 쉽고 팩스가 쉽다는 것이다.
    그걸 이룬 건 AOP이야.
    횡단적인 관심(고속 캐시 관리)을 핵심적인 관심에서 분리한 코드는 다음과 같다.
    class CacheInterceptor implements MethodInterceptor
    {
        public function invoke(MethodInvocation $invocation)
        {
            // 横断的な関心
            $obj = $invocation->getThis();
            $args = $invocation->getArguments();
            $id = get_class($obj) . serialize($args);
            $saved = $this->cache->fetch($id);
            if($saved){
                return $saved;
            }
            $result = $invocation->proceed(); //コアな関心
            $this->cache->save($id, $result);
            return $result;
        }
    
    }
    
    위에서 말한 절단기를 만들고 핵심 흥미를 연결하면 캐시 관리를 통해 핵심 흥미를 처리할 수 있습니다.

    RESTful Resource(HyperMedia)


    객체를 웹 서비스로 인식하는 아이디어를 실현하는 것은 BEAR입니다.Resource가 됩니다.
    다음은 자원 객체입니다.클래스에 URI를 매핑합니다.
    class Author extende ResourceObject
    {
        public $code = 200;
        public $headers = [];
        public $body = [];
    
        /**
         * @Link(rel="blog", href="app://self/blog/post?author_id={id}")
         */
         public function onGet($id)
         {
            //...
            return $this;
         }
    
         public onPost($name)
         {
            $this->code = 201;
            return $this;
         }
    }
    
    여러분, 주의하신 것은 모조한 @Link 부분입니다.
    이것은 URI 템플릿을 사용하여 리소스 간의 링크입니다.
    이렇게 REST, API 개발을 중심으로 개발하면 웹이 성공한 이유를 따를 수 있다.

    매듭을 짓다


    지금까지 본 것을 정리한 결과 베어.Sunday가 무엇인지는 다음과 같다.

    Connecting frameworks


  • DI - object as dependency

  • AOP - domain logic to application logic

  • Hypermedia - resource to resource
  • BEAR.Sunday는 연결 프레임입니다.
    DI는 의존적인 연결 대상 사이, AOP는 본질적인 관심과 횡단적인 관심을 연결하고, REST(Hyperrmedia)는 자원 사이를 연결한다.

    Abstraction framework

  • DSL
  • Annotation
  • URI
  • Interface
  • Aspects
  • Hypermedia
  • BEAR.Sunday는 실현을 직접적으로 나타내는 것이 아니라 추상화 의도를 나타내는 틀이다.

    Zen framework


    BEAR.선데이는 세련된 선정의 틀이다.간단하지만 완벽하게 조화로운 틀이다.

    기사를 쓸 때 참고하는 것

  • 군산 선생의 강연
  • BEAR.Sunday( https://bearsunday.github.io/ )
  • BEAR Blog( http://koriym.github.io/ )
  • 튜토리얼도 알차다.
    일본어 -> https://bearsunday.github.io/manuals/1.0/ja/tutorial.html
    English -> ( https://bearsunday.github.io/manuals/1.0/en/tutorial.html )

    1차 투고 때의 수정


  • Bear.선데이가 아니라 베어.선데이다.
  • 구조기는 모방할 필요가 없다
  • 좋은 웹페이지 즐겨찾기