Come aderire al (DRY) principio di non fare-da-te Ripetere quando ci saranno troppi if-then-else rendere il codice illeggibile?

StackOverflow https://stackoverflow.com/questions/937225

Domanda

Mi piacerebbe aderire al non fare-da-te Repeat linea di principio, ma a volte quando scrivo PHP con HTML e CSS, se ho ri-utilizzare lo stesso codice per situazioni diverse, il mio codice presto avrà così molti if-then-else che il codice non è facilmente gestibile.

Questo potrebbe essere un problema più grande se Smarty, viene utilizzato il motore di template, perché editor di codice non più corrisponderà {if} {else} {/ if} Così il programmatore ha bisogno di cercare il tag corrispondente visivamente, e non è facile quando ci sono 3 o 4 livelli di nidificato {if} {else} {/ if}.

In tale situazione, c'è un modo per attaccare ad asciugare, ma hanno ancora buon codice mantenibile?

È stato utile?

Soluzione

In mancanza di un quadro completo, quello che io tendo a fare per i contenuti (anche se contiene la logica) è separano fuori in file e utilizzare un'altra valutazione logica di fondere insieme (li mangle) e quindi valutare la logica di template dopo. Questo chunkifies il contenuto e rende pezzi condivisibili / riutilizzabile sullo stato comune.

In questo modo ogni buffer modello finale è un albero di discrete appiattito riutilizzabili pepite di contenuti che è possibile memorizzare su disco o in un database. Anche qualcosa di semplice come un piccolo parser che sostituisce:

<h1>{{insert:shared_page_header}}</h1>

Con shared_page_header.txt aiuta tenere le cose separate. Costringe anche voi a guardare la separazione sulle preoccupazioni anche nella logica che è incorporato nei modelli. gestibili, pezzi riutilizzabili di qualsiasi cosa (dinamica o no) sono sempre la strada da percorrere. I suoi modelli sono solo stringhe fino valutata, così li trattano come componenti condivisi fuse in un big-dirty-string (TM) e poi valutati.

Good Luck

Altri suggerimenti

Proprio così abbiamo più informazioni ... Quale programma stai usando per scrivere il codice?

Suggerimenti per non ripetere se stessi:

utilizzare una sorta di template. In questo modo si evita di dover ripetere il codice per visualizzare il contenuto in ciascuna delle tue pagine. OSSIA Se si dispone di un sito con 20 pagine e si decide di cambiare il layout, non si vuole avere a passare attraverso e poi cambiare tutto 20 le pagine.

Usare le funzioni. Se si dispone di codice che esegue un compito specifico, non scrivere che codice più volte in tutto il programma / pagina. Creare una funzione e quindi chiamare in ogni punto in cui è necessario che il compito svolto. In questo modo se avete bisogno di fare un cambiamento è sufficiente modificare che una funzione e non hanno per la ricerca nel codice per trovare ogni luogo che è stato eseguito questo compito. Se sai di classi e metodi (un metodo è una funzione in una classe), per molti compiti, questo è ancora migliore in quanto fornisce l'incapsulamento dei dati e consente di funzioni relative raggruppare in modo che è possibile includere la classe in futuro progetti come necessario.

Se si hanno difficoltà con un sacco di if / else dichiarazioni e il codice non essere molto leggibile ci sono alcune cose che puoi fare:

1. Prendere in considerazione cercando un nuovo editor. Codice pieghevole è un must. Alcuni editori hanno anche le linee verticali che evidenziano e abbinare Codice rientrato in modo da sapere che cosa va con che cosa. Se si desidera un editor gratuito decente, mi sento di raccomandare Notepad ++ in quanto ha entrambe queste caratteristiche (basta google, non posso aggiungere link qui).

2. Ci sono tecniche che è possibile utilizzare per ridurre il numero di nidificato se le dichiarazioni che avete ...

Esempio (il codice):

if (item1 == true) {
   if (item2 == true) {
      item3 = 5;
   }
   else {
      item3 = 10;
   }
}
else {
   if (item2 == true) {
      item3 = 15;
   }
   else {
      item3 = 20;
   }
}

Può anche essere appiattita in:

if (item1 == true && item2 == true) {
   item3 = 5;
}
else if (item1 == true && item2 == false) {
   item3 = 10;
}
else if (item1 == false && item2 == true) {
   item3 = 15;
}
else {
   item3 = 20;
}

Quindi, se si dispone di 3 o 4 livelli di nidificato se / elses e si vuole appiattire fuori, è possibile trovare il codice più leggibile di utilizzare più argomenti, come sopra. Lo fa la stessa cosa, è solo una questione di preferenza per il quale modo di farlo.

Prova e non mescolare la logica (sto supponendo PHP) e il display (sto assumendo HTML / CSS). Questo non è sempre facile da fare, ma utilizzando i modelli e CSS, è possibile. Lasciate che vi faccia un esempio pratico di come si può fare questo su una home page che visualizza un nome di utenti come un messaggio di benvenuto.

Inline PHP (cercare di evitare):

<html>
   <body>
      <?php
      if ($logged_in == true) {
         echo "Welcome ",$user->name(),"!";
      }
      else {
         echo "Welcome Guest!";
      }
      ?>
   </body>
</html>

La logica separata dal display (migliore):

<?php
if ($logged_in == true) {
   $greetingMessage = "Welcome ",$user->name(),"!";
}
else {
   $greetingMessage = "Welcome Guest!";
}
?>

<html>
   <body>
      <?php echo $greetingMessage; ?>
   </body>
</html>

^ Mantenere la logica separata dalla visualizzazione (HTML) aiuterà non si ottiene sopraffatto quando il progetto comincia a diventare davvero complessa. E 'meglio solo non mescolare! :)

Buona fortuna uomo!

La prima frase della tua domanda è il problema, IMO. Davvero non dovrebbe essere mescolando codice con il tuo vista (cioè HTML e CSS). Ci sono diversi framework PHP MVC che vi aiuterà non si esegue questa operazione. Zend Framework è abbastanza decente, ma ci sono anche altri.

Se non si desidera utilizzare un framework, quindi suggerirei refactoring le pagine di non utilizzare il codice come questo e chiamare gli oggetti sul back-end. Mescolando il codice e visualizzare rapidamente diventa impossibile da mantenere in qualsiasi la lingua, non solo PHP.

Ora non posso essere che la familiarità con attuazione di concetti OOP utilizzando PHP, ma refactoring quelli annidati if-else e metterli in una funzione ben named-aiuta molto a tenere il passo con il principio DRY. E poi, attaccare con il principio DRY non rendere il codice mantenibile.

Con un file script di esempio che sarebbe stato molto più facile per noi di indicare dove si sta andando male, tuttavia alcune cose che può o non può aiutare a seconda di cosa si sta cercando di ottenere:

  • Dando uno sguardo al sintassi alternativa per il controllo strutture . Alcune persone preferiscono usare questo stile nella scrittura dei file che contengono principalmente HTML, PHP viene utilizzato solo per decidere le sezioni che HTML per l'output.

  • Split le sezioni di codice riutilizzabili in file che in seguito sarà possibile includere, ad esempio. header.php, footer.php etc.

  • L'utilizzo di un IDE che supporta codice pieghevole

In bocca al lupo

Se le dichiarazioni sono considerati istruzioni logiche, essi dovrebbero essere evitati in vista il più possibile in quanto violano i principi MVC.

Passare alla visualizzazione aiutanti, invece, ad esempio:

class LoggedUsernameHelper
{
    protected $user;

    public function __construct(SomeUserObject $user)
    {
        $this->user=$user;
    }

    public function __toString()
    {
        return $user->isLogged() ? sprintf('Welcome %s', $user->getUsername()) :
            'Welcome guest';
    }
}

Questo codice è riutilizzabile, verificabile, non mancherà di tenere il vostro codice a secco:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top