Rendere il codice più "modulare"

2

Come sviluppatore PHP procedurale semi-esperto, il mio OOP ha ancora bisogno di molto lavoro. Sto ancora lavorando con i principi SOLID e altre teorie e linee guida di OOP, e sono bloccato con qualcosa che sembra a dir poco UGLY, e sicuramente non conferma a SOLID.

Sono occupato a ripristinare il CMS interno, utilizzando CodeIgniter 3.0.x e MaterializeCSS per il front-end.

Ecco il bit di codice in questione che semplicemente non funziona per me:

public function add($uid)
{
    $data['userdata'] = $this->usercontact_model->get_user($uid);
    if (empty($data['userdata']))
    {
        return false;
    }
    else
    {
        $temp = $this->usercontact_model->get_contact_types();
        $temp_options = array();
        if (!empty($temp))
        {
            foreach ($temp as $tk => $tv)
            {
                $temp_options[$tk]['value'] = $tv['id'];
                $temp_options[$tk]['display'] = $tv['name'];
            }
        }            
        $data['sidebar'] = array(
            0 => array(
                'type' => 'accordion',
                'content' => array(
                    0 => array(
                        'icon' => 'settings',
                        'active' => 'active',
                        'heading' => 'Page actions',
                        'prompt' => lang('user_contacts_page_actions_head') . '<br />&nbsp;<br />',
                        'body' => '
                            &raquo;&nbsp;<a href="' . base_url('user/usercontact/list_contacts') . '/' . $this->session->userdata('id') . '">' . lang('user_contacts_return_contacts') . '</a><br />
                            &raquo;&nbsp;<a href="' . base_url('user/login/control_panel') . '">' . lang('user_contacts_return_cpanel') . '</a><br />
                        '
                    )
                )
            )               
        ); 
        $data['open_data'] = array(
            'action' => '',
            'method' => 'post',
            'hidden' => array(
                'user_id' => $this->session->userdata('id')
            )
        );   
        $data['close_data'] = array(
            'datepicker_init' => 'true',
            'select_months' => 'true',
            'select_years' => 15,
            'format' => 'yyyy-mm-dd',
            'clockpicker_init' => 'true'
        );        
        $data['contact_type_data'] = array(
            'id' => 'contact_type_select',
            'heading' => 'user_contact_type',
            'options' => $temp_options
        );
        $data['active_data'] = array(
            'id' => 'active_select',
            'heading' => 'user_contact_active',
            'options' => array(
                0 => array(
                    'value' => 'Yes',
                    'display' => lang('user_contact_yes')
                ),
                1 => array(
                    'value' => 'No',
                    'display' => lang('user_contact_no')
                )
            )
        );            
        $data['value_data'] = array(
            'id' => 'value',
            'validate' => 'validate',
            'placeholder' => 'Content',
            'label' => 'user_contact_label_value'
        );
        $data['vacation_from_data'] = array(
            'id' => 'vacation_from',
            'placeholder' => 'Select vacation start date',
            'label' => 'user_contact_vacation_from'
        );
        $data['vacation_to_data'] = array(
            'id' => 'vacation_to',
            'placeholder' => 'Select vacation end date',                
            'label' => 'user_contact_vacation_to'
        );            
        $data['time_from_data'] = array(
            'id' => 'time_from',
            'placeholder' => 'Select available start time',                
            'label' => 'user_contact_time_from'
        );
        $data['time_to_data'] = array(
            'id' => 'time_to',
            'placeholder' => 'Select available end time',                
            'label' => 'user_contact_time_to'
        );  
        $data['submit_data'] = array(
            'id' => 'submit_add',
            'label' => lang('user_contact_save'),
        );                        
        $posts = $this->input->post();
        if (empty($posts))
        {
            $this->core->render_view('template_admin', 'usercontact/add', $data);
        }
        else
        {
            $this->core->render_view('template_admin', 'usercontact/add', $data);
            preint($posts);                
        }
    }
}

Ora - Non ho ancora convalidato questo concetto, ma ciò renderà questo sicuramente più brutto usando il mio attuale approccio a funzioni singole.

preint() è solo una funzione che ho creato che fa un print_r avvolto in <pre></pre>

Domande specifiche:

  1. In che modo, utilizzando CI 3.0.x, posso rendere questo più compatibile con SOLID?
  2. Come posso renderlo più leggibile?
  3. Come posso accorciare questo? Spostare elementi come la convalida e la creazione degli array di campi e sidebar per separare funzioni / classi?

Le risposte o i suggerimenti a uno o tutti i precedenti potrebbero essere molto apprezzati.

    
posta Kobus Myburgh 12.04.2016 - 12:16
fonte

1 risposta

1

Ciascuna di queste sottostrutture $data può essere probabilmente astratta nelle proprie classi. Trova le somiglianze tra loro e crea un albero genealogico di classi. Potresti anche essere in grado di riutilizzare una singola classe per loro generale.

Devi passare i dati dell'utente al metodo, non cercarlo all'interno. Ogni metodo dovrebbe essere monouso e avere dipendenze da esso. Ecco come si creano livelli e si separano le preoccupazioni.

$temp_options viene utilizzato solo una volta, quindi spostalo più vicino a dove è stato utilizzato. Oppure, dato che dovresti fare in modo che la cosa lo usi nella sua classe, esegui il re-keying in quell'oggetto.

Non codificare l'HTML. Ecco a cosa serve la vista. Fai in modo che la vista faccia il lavoro di costruzione di link e formattazione, ecc.

Rendi l'oggetto utente (se hai anche un oggetto utente) restituisci gli URL appropriati. In questo modo la vista può solo chiamare $user->getControlPanelURL() , ecc.

Potresti anche rappresentare URL come oggetti e dargli dei metodi di __toString() in modo da poterli echo direttamente dalla vista.

Può essere difficile abituarsi a OOP quando si viene da un background procedurale. Pensa a LEGO.

Anche questo libro è richiesto per la lettura di qualsiasi sviluppatore OOP. link

    
risposta data 12.08.2016 - 12:40
fonte

Leggi altre domande sui tag