코드를 멍청하게 유지하십시오

7169 단어 codesmellsjavascript
얼마전 우연히 본 트윗...






자바스크립트 데일리


@javascriptdaily






지연 값을 사용하여 JS 앱 속도 향상: bitovi.com/blog/lazy-valu…


오후 23:21 - 2017년 11월 12일









제안된 솔루션은 getter를 사용하여 필요할 때 값을 채우는 것이었습니다. 다음과 유사합니다.

function getUniqueId() {
  // pretend this is some expensive computation
  return '--id--'
}

function MyObject () {
}

// lazy getter for 'id'
Object.defineProperty(MyObject.prototype, 'id', {
  get: function() {
    const value = getUniqueId()
    Object.defineProperty(this, 'id', { value, enumerable: true })
    return value
  }
})

const obj = new MyObject()
console.log(obj) // > {}
console.log(obj.id) // > "--id--"
console.log(obj) // > { id: "--id--" }


언뜻 보기에 이 코드는 매우 영리해 보입니다. 지금은 잘 작동할 수 있지만 이와 같은 코드가 있는 버그는 나중에 추적하기 어렵거나 코드베이스에 더 심각한 재앙이 될 것입니다.

저는 현재 게으른 게터가 있는 대규모 레거시 C# 프로젝트를 유지 관리합니다. 이 코드는 수년 전에 과거 프로그래머의 유령에 의해 작성되었으며 작성 당시에는 매우 영리했습니다.

이것과 비슷한 것:

// BAD: clever code
public class House
{
  private _cats Cat[];

  public int Id { get; set; }

  // Lazy property that "does work". "work" should be in a function, not prop.
  public Cat[] Cats
  {
    get
    {
       if (_cats == null)
       {
         _cats = db.GetCats(Id);
       }

       return _cats;
    }
  }
}



오늘날 이 영리한 코드가 우리를 괴롭히고 있습니다.

캐싱을 위해 Redis를 사용하는 최근 프로젝트가 있었습니다. 캐싱을 위해 직렬화 프로세스 중에 모든 게으른 값이 열거된다는 것을 (프로덕션 출시 후) 깨달았습니다. 결국 배포를 롤백해야 하는 프로덕션에서 CPU가 엄청나게 급증했습니다.

해당 배포에 여러 항목이 있었기 때문에 팀에서 CPU 스파이크를 유발한 것이 새로운 Redis 코드인지 확인하는 데 시간이 걸렸고 Redis 코드가 CPU 스파이크를 유발한 이유를 확인하는 데 더 오랜 시간이 걸렸습니다.

다음과 같은 멍청한 코드를 사용했다면 ...

// GOOD: dumb code
public class House
{
  public Cat[] GetCats()
  {
    // ...
  }
}



... 우리는 결코 이 문제에 부딪히지 않았을 것입니다.

코드베이스는 이제 백만 라인이 넘고 결코 존재하지 말았어야 할 문제에 대한 수정은 기념비적입니다. 현재까지도 미정입니다.

이 영리한 코드가 우리를 골탕 먹인 것은 이번이 처음이 아닙니다. 코드에는 다음과 같은 위치가 표시됩니다.

// BAD: In this code, `house.Cats` has to be touched
//      in order for the property to be populated.

var house = db.GetHouse(id);

// WTF?
house.Cats;

return DoSomething(house);


이 유형의 코드를 사용하려면 속성id의 구현을 파헤쳐 사용법을 이해해야 합니다. 이 코드 냄새는 너무 심해서 나를 비참하게 만듭니다.

영리한 코드가 돌아와서 코드베이스를 괴롭히는 것을 너무 많이 보았습니다.

영리한 코드를 사용하면 똑같이 영리한 버그를 찾아 해결할 수 있습니다. 프로그램을 멍청하게 유지하면 코드와 버그를 더 쉽게 찾을 수 있습니다.

아래 댓글에서 영리한 코드에 어떻게 물렸는지에 대한 이야기를 듣고 싶습니다!

Twitter에서 나를 팔로우하거나

건배!

좋은 웹페이지 즐겨찾기