strategies for managing long class files in php

前端 未结 6 799
野的像风
野的像风 2021-02-09 08:37

I\'ve got a bunch of functions that I want to move into a class. They\'re currently split into a couple of fairly long files. I\'d prefer not to have one 2500 line file, but as

6条回答
  •  南方客
    南方客 (楼主)
    2021-02-09 09:07

    As far as building the view is concerned, you might like to try the CompositeView pattern.

    Here's a small example of how it could look in PHP. Pretend, for the sake of this example, that View::$html is encapsulated in a Template class that can load html from disk and allows you to inject variables, handles output escaping, etc.

    interface IView {
        public function display();
    }
    
    class View implements IView {
        public $html = ''; 
    
        public function display() {
            echo $this->html;
        }   
    }
    
    class CompositeView implements IView {
        private $views;
        public function addPartial(IView $view) {
            $this->views[] = $view;
        }   
        public function display() {
            foreach ($this->views as $view) {
                $view->display();
            }   
        }   
    }
    

    The reason for the IView interface is to allow you to build composite views with other composite views.

    So now consider a form with three parts: header, body and footer.

    class HeaderView extends View {
        public function __construct() {
            $this->html .= "

    Hi

    \n"; } } class BodyView extends View { public function __construct() { $this->html .= "

    Hi there.

    \n"; } } class FooterView extends View { public function __construct() { $this->html .= "

    © 2012

    \n"; } }

    (Again, you wouldn't just write HTML into that public variable and handle output escaping yourself. You'd likely reference a template filename and register your data via the template's interface.)

    Then, to put it all together you would go:

    $view = new CompositeView();
    // here you would make decisions about which pieces to include, based
    // on your business logic.  see note below.
    $view->addPartial(new HeaderView());
    $view->addPartial(new BodyView());
    $view->addPartial(new FooterView());
    $view->display();
    

    So now your views can be composed and the fragments reused, but you can easily make a mess with the code that builds them, especially if you have a lot of conditions and many different possible outcomes (which it sounds like you do.) In that case, the Strategy pattern will probably be of some help.

    If you haven't already read UncleBob's SOLID article, do it before anything else! At least the Single Responsibility Principle. I would also recommend reading Refactoring to Patterns by Joshua Kerievsky at some point.

提交回复
热议问题