Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はじめてのIT勉強会 #2 Readable Code Part 2

はじめてのIT勉強会 #2 Readable Code Part 2

仙台で開催した「はじめてのIT勉強会」第二回のセッションスライドです。
リーダブルコードの紹介と入門的な解説内容になっています。

naoki

May 25, 2017
Tweet

Other Decks in Programming

Transcript

  1. 修正前のコード results := datastore.Query().Filter("year <= 2011") A: 2011年以前のデータを取得する results :=

    datastore.Query().Select("year <= 2011") B: 2011年以前のデータを除いて取得する results := datastore.Query().Exclude("year <= 2011")
  2. // textの末尾を切り落として、「…」をつける func clip(text string, length int) string // 後ろの6文字を切り落とし?

    (remove:取り除く) assert.Equal(t, "Hello, readable...", clipped) clipped := clip("Hello, readable code!", 6)
  3. // textの末尾を切り落として、「…」をつける func clip(text string, length int) string // 後ろの6文字を切り落とし?

    (remove:取り除く) assert.Equal(t, "Hello, readable...", clipped) clipped := clip("Hello, readable code!", 6) // 6文字までで切り落とし? (truncate:切り詰める) assert.Equal(t, "Hello,...", clipped)
  4. // textの末尾を切り落として、「…」をつける func clip(text string, length int) string なんの長さ? バイト数

    maxBytes 文字数 maxChars 単語数 maxWords // 修正例 func truncate(text string, maxChars int) string
  5. const CART_TOO_BIG_LIMIT int = 10 // ショッピングカート内のアイテムが10件より多い場合はエラー if len(shoppingCart) >=

    CART_TOO_BIG_LIMIT { return errors.New("カートにある商品が多すぎます。") } このコードにはバグがあります。
  6. const CART_TOO_BIG_LIMIT int = 10 // ショッピングカート内のアイテムが10件より多い場合はエラー if len(shoppingCart) >=

    CART_TOO_BIG_LIMIT { return errors.New("カートにある商品が多すぎます。") } このコードにはバグがあります。 Ans:ショッピングカートに9件しか入らない。
  7. // 指定した範囲の数値を取得する func intRange(start int, stop int) []int iRange :=

    intRange(2, 4) iRangeの値は何が入る? [2, 3]? [2, 3, 4]?
  8. // 修正版 func intRange(first int, last int) []int iRange :=

    intRange(2, 4) // [2, 3, 4] maxとminを使用しても良い
  9. 最後の要素まで含まない範囲なら beginとendを使う 1 2 3 4 5 ↓begin ↓end //

    指定した範囲の数値を取得する func intRange(begin int, end int) []int iRange := intRange(2, 4) // [2, 3]
  10. // 実装 type StaticsCollector struct{} func (s *StaticsCollector) addSample(x float64)

    {} func (s *StaticsCollector) getMean() float64 { // 全てのサンプルをイテレートして、total / num_samples を返す。... } 実装はO(n)だった... もしサンプルが1000万件あったらorz
  11. get*()からcompute等へ変更する // 実装 type StaticsCollector struct{} func (s *StaticsCollector) addSample(x

    float64) {} func (s *StaticsCollector) computeMean() float64 { // 全てのサンプルをイテレートして、total / num_samples を返す。... } あるいは処理を工夫してO(1)になるようにする
  12. exprimentId = 100 description = "フォントを14ptに上げる" fontSize = 14pt ...

    // 複数の設定項目 trafficFraction = 5% ある実験をするための設定ファイル
  13. exprimentId = 101 description = "フォントを13ptに上げる" fontSize = 13pt ...

    // 複数の設定項目 [再利用する実験ID] = 100 同じような実験をする必要があるが、 設定ファイルをコピペして作るのは嫌なので... こんなふうに書けるようにしたい
  14. experimentId = 100 reuse = 100 名前を考えてみよう 2.reuse reuseだけだと「100回再利用可能」と誤解される可 能性がある。

    reuseIdにすれば多少よくなるけど、「再利用ID」とい う別のなにかに勘違いされるかもしれない。