2013-07-05 13 views
7

私は非常に大きな機能を持っていることがあります。その機能はスクリプトの他の部分では使用されないため、「圧縮」や小さな機能に分離することは非常に困難です。関数を複数回使用する場合にのみ関数を作成する必要がありますか?

私はスクリプトの他の部分で使用されない関数を作成すべきか、複数回使用する場合にのみ作成する必要があるのか​​についてアドバイスしたいと思います。

ありがとうございます!

概要:

  • は、ディレクトリ内のファイルの情報で配列を塗りつぶします。
  • TXTを1行ずつ処理し、TXTのIDが「完了」ファイル配列と一致するかどうかを調べ、それを外部製品に公開します。そうでない場合は、他のアレイをチェックインして、欠落しているもののレポートを作成します。
  • アレイで見つかったエラーを に保存してから、errors.txt
  • ファイルに保存します。最後に、レポートを返します。

現在、私の機能は次のとおりです。

protected function processScanned() 
    { 
    try 
    { 
     // EJECUTAR BASH DE NAHUEL 
     // 
     // 
     $PdfCPList = $this->model->getDirFilenames($this->model->dirCartasPorte, 'pdf'); 
     $PdfTBList = $this->model->getDirFilenames($this->model->dirTicketsBalanza, 'pdf'); 
     $PdfCompList = $this->model->getDirFilenames($this->model->dirCompletos, 'pdf'); 
     $PdfUnreconList = $this->model->getDirFilenames($this->model->dirSinReconocer,'pdf'); 
     // Adjuntar Novedades 
     $newsToProcess = $this->model->getDirFilenames($this->model->dirNovedades, 'txt', true); 
     $this->appendNewsFiles($newsToProcess); 
     $report = array(); 
     $report['info'] = array(
     'Documentos procesados correctamente'=>0, 
     'Fecha de última actualización de datos'=>date('d/m/Y H:i:s',(int)file_get_contents($this->model->uriTxtInfo)), 
    ); 
     if($file = fopen($this->model->uriTxtProcesar, 'r')) 
     { 
$i = 0; 
     $errors_file = fopen($this->model->uriTxtErrores,'w'); 
     while($line = fgets($file)) 
     { 
      if(! preg_match('/^\s/', $line)) 
      continue; 

      $lineData = array(
      'id'=> substr($line,3,9), 
      'prefix'=>'1234-' . $i, 
      'suffix'=>'1234-' . $i, 
      'partner'=>'FAZON TIMBUES OMHSA', 
      'date'=>time() - 222, 
     ); 
$i++; 
      $keywordsToPublish = array(
      'Nº de Operacion'=>$lineData['id'], 
      'Prefijo'=>$lineData['prefix'], 
      'Sufijo'=>$lineData['suffix'], 
      'Socio'=>$lineData['partner'], 
      'Fecha'=>date('Y/d/m',$lineData['date']), 
     ); 

      if($this->model->findInDocusearch($lineData['id'])) 
      { 
      continue; 
      } 

      if(array_key_exists($lineData['id'], $PdfCompList)) 
      { 
      $lineData['docName'] = 'Carta de Porte - Ticket de Balanza'; 
      $lineData['docId'] = 'CP-TB'; 
      $lineData['path'] = $this->model->dirCompletos . '/' . $lineData['id'] . '.pdf'; 
      if($id = $this->model->publishInDocusearch($lineData, $keywordsToPublish)) { 
       $report['info']['Documentos procesados correctamente']++; 
       link($this->model->dirDocusearchRepo . '/' . $id . '.pdf', 
       $this->model->dirBackupCliente . '/' . $lineData['partner'] . '_' . date('Ymd',$lineData['date']) . '_' . $lineData['id'] . '.pdf' 
      ); 
      } 
      unset($PdfCompList[ $lineData['id'] ]); 
      } 
      else 
      { 
      fwrite($errors_file, $line); // Guarda la fila leida en el archivo de errores. 
      // Valores por defecto 
      $report[ 'errors' ][ $lineData['id'] ]['date'] = $lineData['date']; 
      $report[ 'errors' ][ $lineData['id'] ]['id'] = $lineData['id']; 
      $report[ 'errors' ][ $lineData['id'] ]['type'] = 'nn'; 
      $report[ 'errors' ][ $lineData['id'] ]['actions'] = array(); 
      // Valores por defecto 

      if(array_key_exists($lineData['id'], $PdfCPList)) 
      { 
       $report[ 'errors' ][ $lineData['id'] ]['reportMsg'] = 'Falta Ticket de Balanza.'; 
       $report[ 'errors' ][ $lineData['id'] ]['type'] = 'cp'; 
       unset($PdfCPList[ $lineData['id'] ]); 
      } 
      elseif(array_key_exists($lineData['id'], $PdfTBList)) 
      { 
       $report[ 'errors' ][ $lineData['id'] ]['reportMsg'] = 'Falta Carta de Porte.'; 
       $report[ 'errors' ][ $lineData['id'] ]['type'] = 'tb'; 
       unset($PdfTBList[ $lineData['id'] ]); 
      } 
      else 
      { 
       $report[ 'errors' ][ $lineData['id'] ]['reportMsg'] = 'Ningún archivo digitalizado.'; 
      } 
      } 
     } 

     fclose($file); 
     fclose($errors_file); 
     $this->fileRename($this->model->uriTxtErrores, $this->model->uriTxtProcesar); 
     foreach($PdfCompList as $key=>$value) 
     { 
      $report[ 'errors' ][ $key ] = array( 
      'reportMsg'=>'Falta en archivo de datos del sistema externo.', 
      'date'=>$value['date'], 
      'id'=>$key, 
      'type'=>'co', 
      'actions'=>array('get','rename','delete'), 
     ); 
     } 
     foreach($PdfCPList as $key=>$value) 
     { 
      $report[ 'errors' ][ $key ] = array(
      'reportMsg'=>'Carta de Porte no utilizada.', 
      'date'=>$value['date'], 
      'id'=>$key, 
      'type'=>'cp', 
      'actions'=>array('get','rename','delete'), 
     ); 
     } 
     foreach($PdfTBList as $key=>$value) 
     { 
      $report[ 'errors' ][ $key ] = array(
      'reportMsg'=>'Ticket de Balanza no utilizado.', 
      'date'=>$value['date'], 
      'id'=>$key, 
      'type'=>'tb', 
      'actions'=>array('get','rename','delete'), 
     ); 
     } 
     foreach($PdfUnreconList as $key=>$value) 
     { 
      $report[ 'errors' ][ $key ] = array(
      'reportMsg'=>'Documento no reconocido.', 
      'date'=>$value['date'], 
      'id'=>$key, 
      'type'=>'un', 
      'actions'=>array('get','rename','delete'), 
     ); 
     } 
     return $report; 
     } 
     else 
     { 
     throw new Exception('No se pudo abrir el archivo TXT'); 
     } 
    } 
    catch(Exception $e) 
    { 
     $this->mensaje = $e->getMessage(); 
     header('HTTP/1.1 500 ' . $this->mensaje); 
    } 
} 
+1

主に意見に基づいています:あなたにはより多くの概要を提供するのに役立つ場合にのみ行います –

+0

あなたの機能を論理的な部分に分けることができれば、どうして? – Theraot

+0

大きな関数は小さい関数に分割するのに適しています。理想的には、関数には本体内に数行以上のコードがありません。 – Bart

答えて

12

これは完全にあなた次第です。 (それはあまりにも過度に行われていないとき)

しかし、別の関数にコードブロックを分離
は、コードをより読みやすくすることができます。関数はコードの繰り返し使用を目的とするだけでなく、コードをよりわかりやすく理解しやすくするためのものです。並行して多くのタスクを実行する長い関数を読み込もうとすると失われる可能性がありますが、この関数を使用して関数の一部を小さな関数に分割し、適切な命名関数を使用すると、関数がはるかに短く明確になります将来的に、あるいはあなたのプロジェクトに取り組んでいる次のプログラマーが、あなたが何をしたのかを理解することができます。

さらに、具体的なタスクを処理するオブジェクトを作成することをお勧めします。これにより、(他の多くの利点の中でも)元の機能を損なうことなくクラスを拡張してコードを更新することができます。

編集ごとに、関数を分割する必要があるかどうかを判断する良い方法は、作成した「関数の概要」にあります。 1〜2つ以上のタスクがある場合は、別々の機能に分割することをお勧めします。私は、次の各機能を書いてお勧めします:ディレクトリ内の

  • ファイルの情報で配列を埋める
  • はラインでTXTラインを処理し、TXTでIDが と一致した場合に見えるファイルの配列
  • を「完了します」外部製品にアレイを公開する
  • 他の配列をチェックインして、欠落しているものを報告します。
  • アレイで見つかったエラーを保存してから、 errors.txtに保存します。
  • すべてをまとめて処理し、完了したらレポートを返します。
+0

静的クラス(静的ヘルパー関数のみを含むクラス)を作成することもできます。 – ComFreek

+2

静的関数は** bad **です。そこに静的な負荷を入れて適切なOOPコードをテストしてみてください。 – Jimbo

1

はSOLIDでは、Single Responsibility Principleを見てみるべきでしょう。

オブジェクト指向プログラミングでは、1つの責任原則では、すべてのクラスが1つの責任を持つ必要があり、その責任はクラスによって完全にカプセル化される必要があります。すべてのサービスは、その責任と狭義に連携する必要があります。

これを個々の機能に適用することもできます。それぞれの機能は、それぞれが読み込み可能であり、作成されたメインタスクを実行する必要があります。

あなたはまた、匿名機能について話しているようです。 - 1つのスローワーをオフにします。 PHP manualから

$greet = function($name) 
{ 
    printf("Hello %s\r\n", $name); 
}; 

あなたは$greetはそれが価値だ関数の戻り値を持っているかを見ることができます。

ただし、この関数をコードで複数回使用している場合は、の関数を複数回呼び出すことができます。

0

命名関数は難しいです。したがって、明白な名前のコードブロックが表示されたら、その名前を付ける必要があります。懸念を分けるのは難しい。だから、2つの明らかに別々の懸念があるときはいつでも、それらを明確に分離しておく必要があります。並べ替え操作は難しいです。だから明らかに並べ替えることができる2つの操作が見えるときは、並べ替えを容易にする必要があります。もちろん、一度しか使用できない関数を記述することは理にかなっています。

関連する問題