코드 냄새 154 - 너무 많은 변수

코드를 디버그하고 너무 많은 변수가 선언되고 활성화된 것을 봅니다.

TL;DR: Variables should be as local as possible



문제


  • 가독성
  • 코드 재사용

  • 솔루션


  • 사용하지 않는 변수 제거

  • 문맥



    우리의 코드는 테스트 케이스를 빠르게 프로그래밍하고 작성할 때 지저분해야 합니다.

    커버리지가 좋은 후에는 메소드를 리팩토링하고 줄여야 합니다.

    샘플 코드



    잘못된




    <?
    
    function retrieveImagesFrom(array $imageUrls) {
      foreach ($imageUrls as $index=>$imageFilename) {
        $imageName = $imageNames[$index];
        $fullImageName = $this->directory() . "\\" . $imageFilename;
        if (!file_exists($fullImageName)) {
          if (str_starts_with($imageFilename, 'https://cdn.example.com/')) {
              // TODO: Remove Hardcode
              $url = $imageFilename;
              // This variable duplication is no really necesary 
              // When we scope variables        
              $saveto= "c:\\temp"."\\".basename($imageFilename);
              // TODO: Remove Hardcode
              $ch = curl_init ($url);
              curl_setopt($ch, CURLOPT_HEADER, 0);
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
              $raw = curl_exec($ch);
              curl_close ($ch);
              if(file_exists($saveto)){
                   unlink($saveto);
              }
              $fp = fopen($saveto,'x');
              fwrite($fp, $raw);
              fclose($fp);
              $sha1 = sha1_file($saveto);
              $found = false;
              $files = array_diff(scandir($this->directory()), array('.', '..'));
              foreach ($files as $file){
                  if ($sha1 == sha1_file($this->directory()."\\".$file)) {                         
                      $images[$imageName]['remote'] = $imageFilename;
                      $images[$imageName]['local'] = $file;
                      $imageFilename = $file;
                      $found = true;
                      // Iteration keeps going on even after we found it
                  }
              }
              if (!$found){
                throw new \Exception('We couldnt find image');
             }
            // Debugging at this point our context is polluted with variables
            // from previous executions no longer needed
            // for example: the curl handler
      }
    


    오른쪽



    <?php
    
    function retrieveImagesFrom(string imageUrls) {
      foreach ($imageUrls as $index => $imageFilename) {
        $imageName = $imageNames[$index];
        $fullImageName = $this->directory() . "\\" . $imageFilename;
        if (!file_exists($fullImageName)) {
            if ($this->isRemoteFileName($imageFilename)) {
                $temporaryFilename = $this->temporaryLocalPlaceFor($imageFilename);
                $this->retrieveFileAndSaveIt($imageFilename, $temporaryFilename);
                $localFileSha1 = sha1_file($temporaryFilename);
                list($found, $images, $imageFilename) = $this->tryToFindFile($localFileSha1, $imageFilename, $images, $imageName);
                if (!$found) {
                    throw new \Exception('File not found locally ('.$imageFilename.'). Need to retrieve it and store it');
                }
            } else {
                throw new \Exception('Image does not exist on directory ' . $fullImageName);
            }
        }
    

    발각



    [X] 자동

    대부분의 Linter는 긴 방법에 대한 사용을 제안할 수 있습니다.

    이 경고는 또한 변수를 중단하고 범위를 지정하도록 암시합니다.

    태그


  • 블로터

  • 결론



    우리의 가장 친한 친구입니다.

    우리는 그것을 많이 사용해야 합니다.

    처지
















    리팩토링






    학점



    사진 제공: Dustan Woodhouse on Unsplash


    Temporary variables can be a problem. They are only useful within their own routine, and therefore they encourage long, complex routines.



    마틴 파울러






    이 기사는 CodeSmell 시리즈의 일부입니다.


    좋은 웹페이지 즐겨찾기