2016-10-23 9 views
-1
class Processer 
{ 
    private function processChat() { } 
    private function processUsers() { } 
    private function processBuys() { } 
    private function processOrders() { } 
} 

Ich würde normalerweise verwenden:Php, ist das eine ekelhafte Lösung? Führen Sie alle Methoden mit einer Zeichenfolge beginnen

public function do() 
{ 
    $this->processChat(); 
    $this->processUsers(); 
    $this->processOrders(); 
} 

aber seine leicht zu vergessen, die neue Funktion aufzurufen (wie ich absichtlich die processBuys() Methode verpasst).

Wenn ich Refactoring es wie folgt aus:

public function do() 
{ 
    foreach (get_class_methods($this) as $m) 
    { 
     if (substr($m, 0,7) == 'process') 
     { 
      $this->$m(); 
     } 
    } 
} 

es funktioniert, aber scheint hässlich zu sein (nicht machbar in Java, zum Beispiel)

+1

das sein könnte auch in Java, obwohl es wahrscheinlich keine gute Lösung wäre. Letztendlich suchst du nach einer funktionalen Programmierlösung, für die Java nicht gedacht war (jedenfalls vor Java 8). Wie auch immer, diese Frage ist zwar meinungsorientiert (und damit off-topic), also würde ich sie umgestalten, um mehr faktenbasierte Antworten zu erhalten. – nbrooks

+1

Dies ist in Java mit Reflektion möglich. Wenn Sie nicht einen Rahmen oder einen gemeinsamen Code schreiben, würde ich nicht vorschlagen, es zu tun. Die Reihenfolge der ausgeführten Methoden ist nicht programmiert und kann zu Problemen führen. – sashwat

+1

ist die Frage über die Implementierung der gleichen in Java? –

Antwort

4

Das ist auf jeden Fall eine hässliche Lösung. Rufen Sie die Methoden explizit auf oder refaktorieren Sie Ihren Code.

leicht zu vergessen, die neue Funktion

Ich bin nicht einverstanden zu nennen. Niemand sollte erwarten, dass eine neu hinzugefügte Methode automatisch automatisch aufgerufen wird. Wenn jemand bereits vorhandenen Code ändert, ohne zu verstehen, wie er zuerst funktioniert, wird dies nicht die einzige Sache sein, mit der er falsch liegen könnte.


In Bezug auf Ihre Design-Entscheidungen - warum behandelt eine einzelne Klasse sowohl "Chat" als auch "Bestellungen"? Ich schlage vor, Bewegen der Logik separate Klassen:

(. Dies ist nur ein Beispiel dafür, wie es ohne auf Magie umgesetzt werden können)

interface Process 
{ 
    function execute(); 
} 

class Processor 
{ 
    private $processes; 

    function addProcess(Process $process) 
    { 
     $this->processes[] = $process; 
    } 

    function process() 
    { 
     foreach ($this->processes as $process) { 
      $process->execute(); 
     } 
    } 
} 

class ChatProcess implements Process { function execute() { echo "Executing chat\n"; } } 
class UsersProcess implements Process { function execute() { echo "Executing users\n"; } } 
class PurchasesProcess implements Process { function execute() { echo "Executing purchases\n"; } } 
class OrdersProcess implements Process { function execute() { echo "Executing orders\n"; } } 

// test 
$processor = new Processor(); 

$processor->addProcess(new ChatProcess()); 
$processor->addProcess(new UsersProcess()); 
$processor->addProcess(new PurchasesProcess()); 
$processor->addProcess(new OrdersProcess()); 

$processor->process(); 

Ausgang:

Executing chat 
Executing users 
Executing purchases 
Executing orders 
+0

ja, scheint cool zu sein - abgesehen von der Tatsache, dass es die Komplexität erhöht und mehr Klassen benötigt –

Verwandte Themen