---
# System prepended metadata

title: 'Entaku.rb #2: レガシーコード'

---

# Entaku.rb #2: レガシーコード


- テストの話
  - フロント
    - レガシーフロントエンド安全改善ガイド
        - https://www.amazon.co.jp/dp/B0811FYH79
    - snapshotテスト
    - リグレッションテスト
    - e2e
    - bootstrap/js/dist入れたりしないといけなくてつらい
  - バックエンド
    - とりあえずでかいformクラスとかだとprivateからあえて書く
    - pythonだとdocテスト使って書いてました。
        - https://docs.python.org/ja/3/library/doctest.html
    - rubyだと `__send__`(or `send`)を使ってprivateメソッドを実行する
    - db設計を変えるのは難しい
    - https://speakerdeck.com/toshimaru/how-to-deal-with-fat-model
    - Fat Controller
        - 古いけどまだ使えそうなパターン
        - https://techracho.bpsinc.jp/hachi8833/2013_11_19/14738
    - ロジックをどこに切り出す？
        - ViewModel
          - https://tech.kitchhike.com/entry/2018/02/28/221159
        - そもそもいつ切り出す？
            - 全体でコンセンサスが取れていない・時期尚早だと統一感がなくなって荒れる
            - Form・Service => どこまでが守備範囲？
                - ビジネスロジックとは・・・？
                - 皆認識が大概ばらばら
                - https://wa3.i-3-i.info/word13666.html
                - システムにおける実際のお仕事部分のこと
                - 
    - バリデーションをモデルに持たせないみたいな話は？
        - ややこしいバリデーションはValidarorクラス
            - ActiveModel::Validator
        - 
        - validate context
        - ある文脈でのみvalidationをかける
        - model#saveにcontextが渡せる
        - https://qiita.com/kadoppe/items/061d137e6022fa099872
        - controller#createから呼んだ場合は、contextに:createが渡る
- レガシーコードとは？
    - Ruby(のプロダクト)にはレガシーコードはある？
        - バージョンによって挙動が違う
        - ライブラリがもうメンテされていない
        - テストがない
    - 開発する上で何かしら障害があるようなコード
        - 可読性が低い
        - データを作るのが難しい
        - 仕様が曖昧
- リファクタリングしたいけどテストがない場合、リファクタリングするのかテストするのか
    - あえて臭いものにフタをする
    - 頑張ってテストを書く
- 銀座Rails
    - テストがないRailsプロジェクトにテストを足す話
    - https://speakerdeck.com/ginkouno/tesutoganairailspuroziekutonitesutowozu-suhua
        - APIの場合はrequest_specから
        - 普通のerbの場合はfeature_specから


moduleに分けたらテストできるかも。
ただ、現実はそこまで甘くない。。。
```ruby
class God

  private
  
  def area(radius)
    radius*radius* PI
  end
end

module GodPrivateMethod
  def area(radius)
    radius*radius* PI
  end
end

class God

  private
  include GodPrivateMethod
end
```
