コードを保存する


私は最近、このつぶやきをつまずいた.

ジャバスクリプト
JavaScriptの設定

あなたのJSアプリをスピードアップする怠惰な値を使用します
午後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 Cheungプロジェクトを維持します.このコードは何年も前にプログラマの過去の幽霊によって書かれていた時に書かれていた非常に賢い.
以下のようなもの
// 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をロールバックしなければならなかった生産におけるそのような大規模なスパイクを引き起こしました.
複数のことがその展開にあったので、それはチームがしばらくの間、RedisコードがCPUスパイクを引き起こしていた理由を決定するためにCPUスパイクとより長い時間を引き起こしていた新しいRedisコードであると決定するためにチームを取りました.
閉じるこの動画はお気に入りから削除されています.
// GOOD: dumb code
public class House
{
  public Cat[] GetCats()
  {
    // ...
  }
}

... 我々は、この問題に決して遭遇しませんでした.
CodeBaseは現在、100万線以上とは存在していないはずの問題の修正プログラムmonmonentalです.今日はまだ未定だ.
これは、この同じクレバーコードが私たちにビットを持っているのは初めてではありません.
// 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の実装を掘り下げる必要があります.このコードの臭いは、それが私をwretchにするので、悪いです.
あまりにも多くの回私は賢いコードが戻ってくるとcodebaseを悩ま見てきた.
巧みなコードは、狩りをし、同様に巧妙なバグを解決するままになります.あなたのプログラムをダムにしてください、そして、あなたのコードとあなたのバグは見つけやすいです.
私はどのようにあなたは以下のコメントで巧妙なコードで咬まれている話を聞くのが大好きだ!
ツイッターで私について来てください
乾杯!