8

関数がスクリプトの他の部分で使用されないため、「圧縮」または小さな関数に分割するのが非常に難しいと感じる非常に大きな関数がある場合があります。

そこで、アドバイスをお願いします。スクリプトの他の部分では使用されない関数を作成する必要がありますか?それとも、複数回使用される場合にのみ作成する必要がありますか?

ありがとう!

概要:

  • ディレクトリ内のファイルの情報で配列を埋めます。
  • TXT を 1 行ずつ処理し、TXT の ID が "Completed" ファイル配列と一致するかどうかを確認し、それを外部製品に公開します。そうでない場合は、他の配列をチェックインして、不足しているもののレポートを作成します。
  • 見つかったエラーを配列に保存し、その配列を 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);
    }
 }
4

3 に答える 3

14

これは完全にあなた次第です。

ただし、
コード ブロックをさまざまな関数に分割すると、コードが読みやすくなります (過度に行わない場合)。関数は、コードを繰り返し使用するだけでなく、コードをより整理して理解しやすくすることも目的としています。多くのタスクを並行して実行する長い関数を読み込もうとすると、道に迷うかもしれませんが、この関数を使用して、適切な名前を付けてその一部を小さな関数に分割すると、関数ははるかに短く明確になります。将来、またはあなたのプロジェクトに取り組んでいる次のプログラマーがあなたが何をしたかを理解するために維持してください。

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

編集によると、関数を分割する必要があるかどうかを判断する良い方法は、作成した「関数の概要」にあります。タスクが 1 ~ 2 つ以上ある場合は、別の機能に分割することをお勧めします。次のそれぞれについて関数を作成することをお勧めします。

  • ディレクトリ内のファイルの情報で配列を埋めます
  • TXT を 1 行ずつ処理し、TXT の ID が "Completed" ファイル配列と一致するかどうかを調べます
  • 外部製品で配列を発行する
  • 他のアレイをチェックインして、不足しているもののレポートを作成します。
  • 見つかったエラーを配列に保存し、その配列を errors.txt に保存します
  • もちろん、すべてをまとめてラップし、完了するとレポートを返す関数です。
于 2013-07-05T14:20:04.890 に答える
1

SOLID では、 Single Responsibility Principleを確認する必要があります。

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

これを個々の関数に適用することもできます。それぞれが読み取り可能で、作成された主なタスクを実行する必要があります。

また、匿名関数について話しているようです-使い捨ての使い捨てです。

PHPマニュアルから:

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

関数がどのよう$greetに値を返すかを見ることができます。

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

于 2013-07-05T14:19:53.120 に答える
0

関数のネーミングは難しい。したがって、わかりやすい名前のコード ブロックを見つけた場合は、その名前を付ける必要があります。懸念事項を分離することは困難です。したがって、2 つの明らかに別個の懸念がある場合は、それらを明確に分離しておく必要があります。操作の並べ替えは困難です。したがって、明らかに順序を変更できる 2 つの操作がある場合は、簡単に順序を変更できるようにする必要があります。もちろん、一度しか使用できない関数を作成することは理にかなっています。

于 2016-01-29T01:10:44.513 に答える