2017-01-20 10 views
1

私は、いくつかのユーザをインポートし、ユーザ情報を変換してデータベースに挿入するクラスを持っています。私はファイルImportEmployeesに、データをインポートするために2つの他のクラスを呼び出すメソッドを持っています。 1つのクラスは特定の基準に一致するユーザーを取得し、もう1つのクラスは残りのユーザーを処理します。これら2つのクラスは、1つのメソッドを除いて全く同じことを行います。その1つの方法は、ユーザーデータを正しく抽出して、2つの異なるクラスを呼び出す方法です。これをうまく処理する良い設計パターンとは何か、あるいはこれを処理してコードの重複を取り除く良い方法です。ここでPHPファイルをリファクタリングしてコードの複製を削除する

は、エントリー・ポイント・クラスImportEmployeesです:full class here

public function handle() 
{ 
    handle(new ImportNapaUsers($this->file)); 
    handle(new ImportNonNapaUsers($this->file)); 
} 

そしてImportNapaUsersクラス:full class here

private function extractUsers() 
{ 
    $users = new ExtractNapaUsers($this->users); 
    $this->napaUsers = $users->getUsers(); 
} 

そしてImportNonNapaUsersクラス:full class here

private function extractUsers() 
{ 
    $users = new ExtractNonNapaUsers($this->users); 
    $this->napaUsers = $users->getUsers(); 
} 

$this->usersは、これらの両方で正確に同じです。また、両方のクラスは、extractUsersメソッドを除いて同一です。

+0

'identical'いや'新しいExtractNapaUsers'があります'新しいExtractNonNapaUsers'メソッドは同じではありません。それはgitのコードですか?そうでない場合はどうしてこれを変更したいのですか? – JustOnUnderMillions

+0

私の最初のコメントを無視してください。 '良いデザインパターン'依存性注入が最初に探します。あなたの 'handle()'メソッドは本当に良いoopに反対しています。クラスメソッドで 'new'を使用しないようにしてください – JustOnUnderMillions

+0

@JustOnUnderMillions私はあなたが精緻化するのが大好きです。 – dericcain

答えて

1

私はいないだろうこれを設計パターンと過度に複雑にする。あなたが必要とするのは、継承クラスと抽象クラスです。

この

abstract class ImportSomeUsers { 
    ... 
    abstract protected function extractUsers(); 
} 

のような)抽象メソッドextractUsersと抽象クラスImportSomeUsersを(作成次にImportSomeUsersクラスを拡張して、あなたのクラスを定義:

class ImportNapaUsers extends ImportSomeUsers { 

    protected function extractUsers() { 
     $users = new ExtractNapaUsers($this->users); 
     $this->napaUsers = $users->getUsers(); 
    } 
} 

class ImportNonNapaUsers extends ImportSomeUsers { 

    protected function extractUsers() { 
     $users = new ExtractNonNapaUsers($this->users); 
     $this->napaUsers = $users->getUsers(); 
    } 
} 
+0

@dericcainあなたの解決策はここにあります! – JustOnUnderMillions

+0

@JustOnUnderMillionsそれは間違いなく重複を減らします。 DIに関するあなたの考えに本当に感謝しています。それは私が考えなかったものです。 – dericcain

1

私はこれを詳しく説明しよう:

public function handle() 
{ 
    handle(new ImportNapaUsers($this->file)); 
    handle(new ImportNonNapaUsers($this->file)); 
} 
  • あなた自身も、そして、あなたは静的にnew XYZの固定を使用してこの関数を呼び出して、完全にOOP
  • aginst、グローバル関数を呼び出すクラスメソッドを持っていますoopに対して
  • あなたのpublic handle()に戻り値がない場合、何か問題が起こった場合はどうしたらいいですか?
  • また、あなたのハンドル()関数は何も

を返さないように思わそして:

private function extractUsers() 
{ 
    $users = new ExtractNonNapaUsers($this->users); 
    $this->napaUsers = $users->getUsers(); 
} 
  • 方法はこれが良いだろうprivateですので、:

    $this->extractUsers(new ExtractNonNapaUsers($this->users));

および方法は、それは非常に複雑なトピックである

private function extractUsers($users) 
{ 
    $this->napaUsers = $users->getUsers(); 
} 

、あなたはそれについての詳細を読んでください次のようになります。

https://de.wikipedia.org/wiki/Dependency_Injection

Object Oriented PHP Best Practices

:)

関連する問題