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

正しくつくるための設計を学ぶ_中間報告

Jun Nakajima
February 26, 2020

 正しくつくるための設計を学ぶ_中間報告

正しいものを正しく作る塾の、「正しくつくるための設計を学ぶ」コースで学んで、自分なりに言語化した内容を、社内で報告LTしたものです
塾で使った資料から引用し、その中で自分の言葉を書き込んだりしています

Jun Nakajima

February 26, 2020
Tweet

More Decks by Jun Nakajima

Other Decks in Business

Transcript

  1. ͳ͔͡· 5XJUUFSɿ!KOVBOL@ ˔ ओʹখചܥγεςϜͷडୗ։ൃΛ΍͍ͬͯ·͢ ˔ ܦྺ ˓ ҩྍػث'4&ʢυϥΠόʔΛѲΔਓʣ ˓ ˠ4&4

    $"41/&5ͱ&YDFMͰઃܭॻΛগʑ ˓ ˠϋϯζϥϘ #BTI ˙ ϞϒϓϩɺϞϒϫʔΫɺ5%%ɺ%%%͕޷͖ͳਓͰ͢ ˙ ීஈ͸डୗ։ൃͰ3%3"࢖༻ͯ͠ͷཁ݅ఆٛ΍ΒɺϞσϦϯά΍Β ௅ઓ͍ͯ͠·͢ 2 まずは自己紹介
  2. • 正しいソフトウェアを設計することをテーマに ◦ なぜ、発展性に焦点を当てるのか ◦ どうやって、設計をしていくのか • というのを各々の開発経験と紐付けていき、形式知→ 内面化をすることをやっていく •

    各々が考え、答えを出し、研鑽をしていく • 塾は考えるきっかけと場を貰っているに過ぎない 会議室の予約・利用状況を確認するプロダクト 塾のスタイルとしては、大学のゼミ方式
  3. • ラーニングパターン ◦ 学び方を話すための共 通言語 40パターン ◦ 設計を創造的に学ぶた めに、これらのパター ンを使う

    会議室の予約・利用状況を確認するプロダクト 塾ではラーニングパターンをとても意識している
  4. • SESの現場でよく経験した • 基本的に機能ごとに人をアサインし、結果的に車輪の 再発明がいたるところで起きる • 人の出入りや要件変更の時に対応しきれずに終わる • 要件変更は大体、ルールに基づく •

    人の出入りに対応する為に、設計書を残せと言われ、 実装の翻訳的な設計書が量産され、辛くなる 会議室の予約・利用状況を確認するプロダクト 機能一覧を元にした手続き的なモジュール分割
  5. • これもSESのg(ry • Windows Formsで作られた社内マスタ画面とか、ほぼ画 面とロジック密結合していて、辛かったよ… • SQL ServerのConnection張るのベタ書きだったり ◦

    DBのテストとか辛いよ • 何でもかんでも詰め込んだ神クラスとか • 自身の設計に関する失敗については、下記も参照 https://speakerdeck.com/jnuank/moderingudeji-cun-sisutemufalseke-shi-hua-nilin-ndahua 会議室の予約・利用状況を確認するプロダクト 関心の分離の失敗
  6. • ユニケージ作法その三 関数の使用は控えよ ◦ 読みやすくする為に上から下に流れるコードを読ませる ◦ →実装の詳細を使う側に読ませる時点で、意図と詳細が 分離できていない ◦ 意図と詳細を分離出来れば、呼び出し側は意図が明白な

    インターフェースを読むだけで済む ▪ intやstringの内部実装は皆さん気にしないよね 会議室の予約・利用状況を確認するプロダクト 関心の分離の失敗(弊社ユニケージ製システムの場合)
  7. 会議室の予約・利用状況を確認するプロダクト 関心の分離の失敗(弊社ユニケージ製システムの場合) indir=/INPUT; outdir=/OUTPUT today=$(date +%Y%m%d) yday=$(date +%Y%m%d -d"yesterday") #

    本日までの実店舗・通販累積データの完成を待つ while sleep 60; do [ $today -lt $(date +%Y%m%d) ] && exit 1 [ ! -e REAL_URE_TOTAL.$today.sem ] && continue [ ! -e EC_URE_TOTAL.$today.sem ] && continue break done # 通販比率を計算する loopj num=1 $outdir/REAL_URE_TOTAL.$today ¥ $outdir/EC_URE_TOTAL.$today | # 1:品番 2:実店舗販売数 3:実店舗販売額 # # 4:通販販売数 5:通販販売額 # awk '{print $1,$2,$4,($4==0?0:$2/$4)}' | marume 4.2 ¥ > $outdir/URE_RATIO.$today # (出力:実店舗/通販比率) # 1:品番 2:実店舗販売数 3:通販販売数 4:実/通比率 • 通販比率を計算すると いう意図が、コメント でしか表されていない • 入出力が計算ロジック が密結合している • 分離されてないと、テ ストがしづらい
  8. • 抽象データ型(ADT)=クラス • 例:金額型 ◦ intなどで扱うとマイナスの数字まで扱えてしまう ◦ マイナスを使わせないように、型でガードする ◦ 値引きなどは?

    ▪ →それ専用の型を定義し、商品・総額の金額か らのみ引かせないような操作(関数)を作る 会議室の予約・利用状況を確認するプロダクト 独自の抽象データ型の定義
  9. 例:金額計算と数量割引 会議室の予約・利用状況を確認するプロダクト 独自の抽象データ型の定義 Money amount(Money unitPrice, Quantity quantity) { if(quantity.isDiscountable)

    return discount(unitPrice, quantity) return unitPrice.multipy(quantity.value()) } 単価と数量を渡したら金額 が返ってくるという意図 割引可能な数量かどうか 判断をするという意図 数量を渡し、掛け算した結 果を返すという意図
  10. 例:金額計算と数量割引 会議室の予約・利用状況を確認するプロダクト 独自の抽象データ型の定義 Money amount(Money unitPrice, Quantity quantity) { if(quantity.isDiscountable)

    return discount(unitPrice, quantity) return unitPrice.multipy(quantity.value()) } 単価と数量を渡したら金額 が返ってくるという意図 割引可能な数量かどうか 判断をするという意図 数量を渡し、掛け算した結 果を返すという意図
  11. 会議室の予約・利用状況を確認するプロダクト 独自の抽象データ型の定義 Money amount(Money unitPrice, Quantity quantity) { if(quantity.isDiscountable) return

    discount(unitPrice, quantity) return unitPrice.multipy(quantity.value()) } 例:金額計算と数量割引 • 果たして数量(Quantity)が 一律的に割引判断してい いのか?(ロジックの置き 場への違和感、ぎこちな さ) • 対象商品とか指定なくて いいのか?そもそも合計 金額◯千円〜割引とかは
  12. • よく言葉を声に出したり、書いたりすることによって、 違和感を覚えることがあると思います ◦ 単語の使い方とか、「てにをは」が変とか • 要件を型として表現するのも一緒だと感じています ◦ クラス名、メソッド名、変数名に対する違和感 ◦

    この型にこんなデータや操作を持たせるという違和感 ◦ このロジックが、全く関係ない引数をもらう違和感 会議室の予約・利用状況を確認するプロダクト 型に表すことによる違和感の発見
  13. 入塾 Before(入塾前に期待をしていたこと) • 要件→設計→実装 がシームレスに繋がることを経験で きるのではないか • 事業会社と子会社という分断をシームレスに繋ぐこと が、設計の力でできるのではないか •

    コード上の名付けやクラスやメソッドの置き場所とい う意思決定がもっと素早くできるようになる ◦ 設計方面でチームリードができるのではないか
  14. • 型が唯一のモジュール構造と説い ている ❏ 6章:抽象データ型 ❏ 11章:契約による設計 ❏ 22章:クラスの見つけ方 ❏

    28章:ソフトウェア構築仮定 会議室の予約・利用状況を確認するプロダクト 発展性についての参考図書