Boilerplate vs Magic
kawasima
Boilerplate
●
アプリケーションを書くうえで、頻繁に繰り返し出て
くるコード片
●
よい日本語訳がない…
↓Spring boot作ってる人
http://www.davidtanzer.net/boilerplate_vs_magic
public User getUser(final long userId) {
transactionManager.newTransaction();
User user = userRepository.get(userId);
user.setLastAccessed(System.currentTimeMillis());
userRepository.save(user);
transactionManager.commitTransaction();
return user;
}
Magic
Magicというか極端な例
Magicも単一責任原則(Single Responsibility Principle)
が守られているならば、悪くはない
http://プログラマが知るべき97のこと.com/エッセイ/単一責任原則
世論
単一責任原則が守られていないことによって
引き起こされるCriticalな問題
public abstract class ActionForm implements Serializable {
public void setMultipartRequestHandler(
MultipartRequestHandler multipartRequestHandler) {
this.multipartRequestHandler = multipartRequestHandler;
}
リクエストパラメータを保持するためのActionFormに、Multipartのハンドラもセット
出来るようになっているため、ここが攻撃の起点になってしまった
Explicit is better than implicit
似た話で、「"暗黙的"よりも"明示的"な方がよい」と
いう原則がある。(多分Python由来)
暗黙に頼るとこういうことに…
Mass assignment
リクエストパラメータから、モデルに無条件でコピー
すると、管理者権限のフラグなど書き換えられては
困るものまで、書き換えられてしまう問題。
JavaでもBeanUtils.populateで時々発生する。
Map Entity
× 暗黙の一括コピー
SrcBean src = new SrcBean();
DestBean dest = new DestBean();
...
Beans.copy(src, dest).excludes("foo", "bar").execute();
かと言って、includes/excludesする属性を選んでコピーするのも
仕様とあっているか確認しづらい
型で明示しよう
Map
Map
Form Entity
そのビジネスロジックで使用するものだけを
受け付けるためにForm的なクラスが存在する。
だからこそ、複数のタイプのリクエストでFormクラスを共用するのは危険
および、Entityをイミュータブルに設計しよう
http://www.slideshare.net/kawasima/ss-40471672
まとめ
●
単一責任原則が何よりも重要
●
守れないクラス/メソッドを作るよりはBoilerplateの方
がよい
●
暗黙的な設計に頼り過ぎると、大きな落とし穴が待っ
ているので、どこかに明示的なレイヤを設計しよう
●
つまりは、Simple made easy

More Related Content

PDF
Antifragile Clojure
PDF
SIerにとっての越境 @ DevLOVE 199
PDF
イミュータブルデータモデル(入門編)
PDF
Try_to_writecode_practicaltest #atest_hack
PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
PDF
Ble android
PDF
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
PPTX
Serviceability Toolsの裏側
Antifragile Clojure
SIerにとっての越境 @ DevLOVE 199
イミュータブルデータモデル(入門編)
Try_to_writecode_practicaltest #atest_hack
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
Ble android
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Serviceability Toolsの裏側

Similar to Boilerplate vs Magic (14)

PDF
Javaセキュアコーディングセミナー東京第4回演習の解説
PDF
実践 NestJS
PPTX
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
PDF
GCを発生させないJVMとコーディングスタイル
PDF
Windows スクリプトセミナー WMI編 VBScript&WMI
PDF
Xamarin で ReactiveUI を使ってみた
PDF
WordPress widget api
PPTX
Mithril - 軽量/高速なMVCフレームワーク
PPTX
[JavaDo] JAX-RS ハンズオン 第2部
PDF
[Basic 9] 並列処理 / 排他制御
PDF
App widgetでテザリング
PPTX
React を導入した フロントエンド開発
PPTX
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
PDF
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
Javaセキュアコーディングセミナー東京第4回演習の解説
実践 NestJS
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
GCを発生させないJVMとコーディングスタイル
Windows スクリプトセミナー WMI編 VBScript&WMI
Xamarin で ReactiveUI を使ってみた
WordPress widget api
Mithril - 軽量/高速なMVCフレームワーク
[JavaDo] JAX-RS ハンズオン 第2部
[Basic 9] 並列処理 / 排他制御
App widgetでテザリング
React を導入した フロントエンド開発
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
Ad

More from Yoshitaka Kawashima (20)

PDF
Grokking Simplicity探訪
PDF
ブルックスのいう銀の弾丸とは何か?
PDF
Are Design Patterns Dead?
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
PDF
ソフトウェアにおける 複雑さとは何なのか?
PDF
Tackling Complexity
PDF
イミュータブルデータモデルの極意
PDF
ソフトウェア開発における『知の高速道路』
PDF
ソフトウェア設計における 意思決定とそのレビューの秘訣
PDF
本番障害に至る病
PDF
システムダウンのひみつ
PDF
Mavenの真実とウソ
PDF
アンチフラジャイルの世界
PDF
Atomic Architecture
PDF
それはYAGNIか? それとも思考停止か?
PDF
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
PDF
ウォーターフォールとアジャイルのフェアな比較
PDF
How to find tech books
PDF
Antifragile Java - Java Day Tokyo 2017 D1-E1
PDF
たとえ日本人同士でも必要な異文化理解力
Grokking Simplicity探訪
ブルックスのいう銀の弾丸とは何か?
Are Design Patterns Dead?
強いて言えば「集約どう実装するのかな、を考える」な話
ソフトウェアにおける 複雑さとは何なのか?
Tackling Complexity
イミュータブルデータモデルの極意
ソフトウェア開発における『知の高速道路』
ソフトウェア設計における 意思決定とそのレビューの秘訣
本番障害に至る病
システムダウンのひみつ
Mavenの真実とウソ
アンチフラジャイルの世界
Atomic Architecture
それはYAGNIか? それとも思考停止か?
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
ウォーターフォールとアジャイルのフェアな比較
How to find tech books
Antifragile Java - Java Day Tokyo 2017 D1-E1
たとえ日本人同士でも必要な異文化理解力
Ad

Boilerplate vs Magic