Closed7
2024-04-08 週の読んだ記事 (コードレビュー/RSpec flaky/技術駆動/目的駆動名前設計/完全コンストラクタ/Tell, Don't Ask
4/9
- JavaScript実行を待っていないケース
- sleepは絶対にダメ派閥なので、共感
- 並び順依存
- match でなく、 include にする
- 動的な連番依存
- 静的に明示することで、依存しないようにする
割れ窓理論でflakyを見過ごすと、そこから崩壊が始まるので
チームでどうするか策を講じておくのが吉よねぇ
4/10
OpenAI 社が提供している ChatGPT も実験的に使ってみましたが、Azure OpenAI Service はレスポンス速度が早く、ChatGPT に比べて 1/3 の時間で回答を返すことができます
そんな早いのか。ユーザー自身が気づいていないニーズを誘発させるの、ジョブ理論を超えてる。。すげぇ。
URL、sugoibot だw
4/11
- 技術駆動パッケージング
- ビジネス概念でディレクトリ切るようにしないと低凝集になる
4/12
- 目的駆動名前設計すること
- 関心の分離をする
- 例: 商品クラス
- 配送、予約、注文etc 等責務が複数ある
- 例: 商品クラス
- 目的不明オブジェクト
- さまざまな目的に使われやすいクラスやモデル
4/13
- 完全コンストラクタ is インスタンス化を確実にできるように「未初期化」の対策や「不正値」の混入を防ぐコンストラクタのバリデーションを設置すること
class Money
ALLOWED_CURRENCY = [:yen]
attr_reader :amount, :currency
def initialize(amount:, currency:)
if amount < 0
raise ArgumentError.new('金額は0以上を入力してください')
end
if currency.nil?
raise ArgumentError.new('通貨単位を入力してください')
end
unless ALLOWED_CURRENCY.include?(currency.to_sym)
raise ArgumentError.new("#{currency}は許可されていない通貨単位です")
end
@amount = amount
@currency = currency
self.freeze #イミュータブル化
end
def add(other)
if @currency != other.currency
raise ArgumentError.new('通貨単位が違います')
end
added = @amount + other.amount
Money.new(amount: added, currency: @currency)
end
end
# minus_money = Money.new(amount: -1, currency: 'yen')
# NG 金額が マイナス
# nil_currency_money = Money.new(amount: 100, currency: nil)
# NG 通貨単位がnil
money = Money.new(amount: 100, currency: 'yen')
money.add(Money.new(amount: 500, currency: 'yen'))
# OK
4/14
Tell, Don't Ask。 優れたOOP とは、オブジェクトにクエリを実行してその代わりに動作するのではなく、オブジェクトに何をしてもらいたいかを伝えることです。データとそのデータに依存する操作は、同じオブジェクトに属します。
- クラスが他のクラス気にしたりいじったりするのは、デメテルの法則に違反する
このスクラップは2024/04/14にクローズされました