SlideShare a Scribd company logo
1 of 21
10分で分かるReadability & SoC
もっと早く知りたかった
プログラミング技法9選
Bizer株式会社 秋山雅之 2019/5/31
Twitter @aki202
● 秋山 雅之
● 1990/05/23
● コンピュータ
計算機科学
StarWars
自己紹介
- Readability 可読性
- SoC 関心の分離
Readability - 可読性
// Good
function f(a, b) {
if (!a) return false
if (!b) return false
return true
}
// Bad
function f(a, b) {
if (a) {
if (b) {
return true
}
}
return false
}
#1 Guard Clause Readability
// Good
const price = 100
function orderProduct() {
Request.send({
price
})
}
const result = orderProduct()
let shouldSendEmail = true
let sendSilently = true
let usersAreLoaded = false
// Bad
const number = 100
function submit() {
Request.send({
price: number
})
}
const r = submit()
let sendEmail = true
let sendSilent = true
let loadUsers = false
#2 表現的命名 Readability
// Bad
const sho = {
familyName: 'Sato',
firstName: 'Sho',
hobby: 'Reading'
}
// Good
const sho = {
familyName: 'Sato',
firstName: 'Sho',
hobby: 'Reading'
}
#3 インデント Readability
// Bad
if (params['u'].split(/:/)[0] == 'admin') {
// This is admin user
}
#4 説明変数 Readability
// Good
const username = params['u'].split(/:/)[0]
if (username == 'admin') {
// This is admin user
}
SoC - 関心の分離
Separation of concerns
● 「1つのことをうまくやれ」
● UNIXでは個々のプログラムを分解不可能な
粒度まで小さくしている。複雑な処理を行な
うときは、それら小さいプログラムをパイプ
(|)で連結し実現する。
#5 Do one thing well SoC
● 例:CDの.jsonファイルの個数を出力
$ ls -l | grep '.json$' | wc -l
4
● ls -l … カレントディレクトリのファイル一覧表示
● grep '.json$' … 拡張子が.jsonのファイルを抽出
● wc -l … 行数(ファイル数)を計算
#5 Do one thing well SoC
● Unixだけの話ではなく、多くのソフトウェア設
計に適用できるアイデア
● 手続き型→オブジェクト指向型もこのアイデア
● Monolithic kernelが死んでMicro kernelが生き残
った理由もこのアイデア
● Node Package, GEM, Single page application,
Micro services, Docker, Atomic designも全てこの
アイデア
#5 Do one thing well SoC
#6 Fat model, skinny controller
● Model層にビジネスロジックを集め、
Controller層は薄く保つ
● ControllerはModelやService(後述)のメソッド
を叩き、自身にビジネスロジックを持たない
SoC
#6 Fat model, skinny controller SoC
# Good(users_controller.rb)
def create
user = User.create!(params)
user.sendmail
end
# Bad(users_controller.rb)
def create
user = User.create!(params)
mailer = Mailer.new
mailer.to = …
if (user.admin?) then
mailer.subject = …
else
mailer.subject = …
end
mailer.send
end
#7 mix-in
● クラス内のメソッドを外部module化する
● Rubocopのデフォルト設定では100行を超え
るクラス定義にWarningが出る
● RailsではActiveSupport::Concernを継承した
moduleをincludeしてmix-in可能
SoC
# Bad
class Issue < ApplicationRecord
validates :title, presence: true
validates :code, presence: true
def notify_to_workers; # 通知の実装 end
end
#7 mix-in SoC
# Good
class Issue < ApplicationRecord
include Issues::Validatable
include Issues::ForWorkersNotificable
...
end
#8 修飾子 SoC
● カプセル化 = 閉じたプログラムの外からは、
必要最低限のデータや操作にだけアクセスを
許可すること(隠蔽化)
● クラスの場合、外からは必要最低限のメソッ
ドしかコールさせたくない
● メソッドに適切な修飾子をつけることで簡易
的にカプセル化できる
# Bad
class UserInviter
def add(new_user)
add_to_db(new_user)
notify(new_user)
...
end
def add_to_db; end
def notify; end
end
# Good
class UserInviter
def add(new_user)
add_to_db(new_user)
notify(new_user)
...
end
private
def add_to_db; end
def notify; end
end
#8 修飾子 SoC
● MVCのいずれのLayerにも該当しないビジネ
スロジックは独立したクラスとして実装した
方が「テスト容易性」「再利用性」「カプセ
ル性」の面で良いときがある
● あるいは複数のModelが相互作用するような
ビジネスロジックのとき
#9 Service layer SoC
# Bad 送金処理(models/concerns/users/payable.rb)
receiver = User.find(params[:target_id])
sender = User.find(params[:sender_id])
sender.bank.minus(params[:price])
receiver.bank.add(params[:price])
Log.create!(receiver, sender, params[:price])
#9 Service layer
# Good 送金処理(models/concerns/users/payable.rb)
transfer = Transfer.new(params[:target_id],
params[:sender_id], params[:price])
result = transfer.do
SoC
● Readable, SoCに属する属さないに関わらず
Better Programmingのための概念は色々ある
● DRY(Don't repeat yourself)原則
● SOLID原則 - OOPの底流にある5つの原則
● YAGNI(You ain't gonna need it)
● GoFのデザインパターン
● etc...
#10 他にも色々...

More Related Content

What's hot

LTで分かる!アセンブラ
LTで分かる!アセンブラLTで分かる!アセンブラ
LTで分かる!アセンブラToru Nayuki
 
ここ数バージョンのIllustratorで強化されながらも見過ごされている(であろう)機能、ベスト10
ここ数バージョンのIllustratorで強化されながらも見過ごされている(であろう)機能、ベスト10ここ数バージョンのIllustratorで強化されながらも見過ごされている(であろう)機能、ベスト10
ここ数バージョンのIllustratorで強化されながらも見過ごされている(であろう)機能、ベスト10swwwitch inc.
 
ピタゴラスイッチでAWS自動化(JAWS-UG-LT @shimy_net )
ピタゴラスイッチでAWS自動化(JAWS-UG-LT @shimy_net )ピタゴラスイッチでAWS自動化(JAWS-UG-LT @shimy_net )
ピタゴラスイッチでAWS自動化(JAWS-UG-LT @shimy_net )崇之 清水
 
Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性
Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性
Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性Yamamoto Reki
 
AWSはとんでもないものを盗んでいきました(JawsDays2013@shimy_net)
AWSはとんでもないものを盗んでいきました(JawsDays2013@shimy_net)AWSはとんでもないものを盗んでいきました(JawsDays2013@shimy_net)
AWSはとんでもないものを盗んでいきました(JawsDays2013@shimy_net)崇之 清水
 
async/awaitダークサイド is 何
async/awaitダークサイド is 何async/awaitダークサイド is 何
async/awaitダークサイド is 何Kouji Matsui
 

What's hot (7)

LTで分かる!アセンブラ
LTで分かる!アセンブラLTで分かる!アセンブラ
LTで分かる!アセンブラ
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
ここ数バージョンのIllustratorで強化されながらも見過ごされている(であろう)機能、ベスト10
ここ数バージョンのIllustratorで強化されながらも見過ごされている(であろう)機能、ベスト10ここ数バージョンのIllustratorで強化されながらも見過ごされている(であろう)機能、ベスト10
ここ数バージョンのIllustratorで強化されながらも見過ごされている(であろう)機能、ベスト10
 
ピタゴラスイッチでAWS自動化(JAWS-UG-LT @shimy_net )
ピタゴラスイッチでAWS自動化(JAWS-UG-LT @shimy_net )ピタゴラスイッチでAWS自動化(JAWS-UG-LT @shimy_net )
ピタゴラスイッチでAWS自動化(JAWS-UG-LT @shimy_net )
 
Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性
Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性
Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性
 
AWSはとんでもないものを盗んでいきました(JawsDays2013@shimy_net)
AWSはとんでもないものを盗んでいきました(JawsDays2013@shimy_net)AWSはとんでもないものを盗んでいきました(JawsDays2013@shimy_net)
AWSはとんでもないものを盗んでいきました(JawsDays2013@shimy_net)
 
async/awaitダークサイド is 何
async/awaitダークサイド is 何async/awaitダークサイド is 何
async/awaitダークサイド is 何
 

Similar to もっと早く知りたかったプログラミング技法9選

New Features in C# 10/11
New Features in C# 10/11New Features in C# 10/11
New Features in C# 10/11Akira Inoue
 
[Cloud OnAir] Talks by DevRel Vol. 1 インフラストラクチャ 2020年7月30日 放送
[Cloud OnAir] Talks by DevRel Vol. 1 インフラストラクチャ 2020年7月30日 放送[Cloud OnAir] Talks by DevRel Vol. 1 インフラストラクチャ 2020年7月30日 放送
[Cloud OnAir] Talks by DevRel Vol. 1 インフラストラクチャ 2020年7月30日 放送Google Cloud Platform - Japan
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話Masanori Masui
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践Yoshifumi Kawai
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignRyuji TAKEHARA
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発Yuta Matsumura
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料OCHI Shuji
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaandroid sola
 
Go 製リアルタイムサーバーの Kubernetes での運用について
Go 製リアルタイムサーバーの  Kubernetes での運用についてGo 製リアルタイムサーバーの  Kubernetes での運用について
Go 製リアルタイムサーバーの Kubernetes での運用についてKairiOkumura
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例Shigeru UCHIYAMA
 
CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-toolNaruto TAKAHASHI
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
Windows コンテナを AKS に追加する
Windows コンテナを AKS に追加するWindows コンテナを AKS に追加する
Windows コンテナを AKS に追加するYuto Takei
 
Azure Machine Learning services 2019年6月版
Azure Machine Learning services 2019年6月版Azure Machine Learning services 2019年6月版
Azure Machine Learning services 2019年6月版Daiyu Hatakeyama
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発Fujio Kojima
 
TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介bitbank, Inc. Tokyo, Japan
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方啓 小笠原
 
AZAREA-Cluster (Hadoop Conference Japan 2013 Winter Demo Image)
AZAREA-Cluster (Hadoop Conference Japan 2013 Winter Demo Image) AZAREA-Cluster (Hadoop Conference Japan 2013 Winter Demo Image)
AZAREA-Cluster (Hadoop Conference Japan 2013 Winter Demo Image) AzareaCluster
 

Similar to もっと早く知りたかったプログラミング技法9選 (20)

New Features in C# 10/11
New Features in C# 10/11New Features in C# 10/11
New Features in C# 10/11
 
[Cloud OnAir] Talks by DevRel Vol. 1 インフラストラクチャ 2020年7月30日 放送
[Cloud OnAir] Talks by DevRel Vol. 1 インフラストラクチャ 2020年7月30日 放送[Cloud OnAir] Talks by DevRel Vol. 1 インフラストラクチャ 2020年7月30日 放送
[Cloud OnAir] Talks by DevRel Vol. 1 インフラストラクチャ 2020年7月30日 放送
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless Design
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsola
 
Go 製リアルタイムサーバーの Kubernetes での運用について
Go 製リアルタイムサーバーの  Kubernetes での運用についてGo 製リアルタイムサーバーの  Kubernetes での運用について
Go 製リアルタイムサーバーの Kubernetes での運用について
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
 
CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-tool
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
Windows コンテナを AKS に追加する
Windows コンテナを AKS に追加するWindows コンテナを AKS に追加する
Windows コンテナを AKS に追加する
 
Azure Machine Learning services 2019年6月版
Azure Machine Learning services 2019年6月版Azure Machine Learning services 2019年6月版
Azure Machine Learning services 2019年6月版
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
 
TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方
 
AZAREA-Cluster (Hadoop Conference Japan 2013 Winter Demo Image)
AZAREA-Cluster (Hadoop Conference Japan 2013 Winter Demo Image) AZAREA-Cluster (Hadoop Conference Japan 2013 Winter Demo Image)
AZAREA-Cluster (Hadoop Conference Japan 2013 Winter Demo Image)
 

もっと早く知りたかったプログラミング技法9選

Editor's Notes

  1. Better Programming=良いプログラミング。 良いプログラミングを実現するためには色々必要。 チームビルディング、継続的インテグレーション、テストツール、フレームワーク、仮想化環境。 その中でも綺麗なコーディングというのも重要なポイントです。 よく言われるきれいなコード、汚いコード。 今回はどうしたらきれいなコードになるのか、僭越ながら自分なりに紹介しようと思います。
  2. ネストが深いと読みづらい。
  3. 綺麗なコードを支えているアイデアは色々ありますが、今回はこの2本柱について話します。 Readabilityはコード1行1行の書き方です。一つの機能のために無数の書き方。リーダブルコードの中から良いなと思ったものを。 SoCはReadabilityより上の概念で、設計に関する原則。
  4. 実践的。
  5. ネストが深いと読みづらい。
  6. 解釈に幅のある単語は避ける。 2語以上の場合、なるべく英文法として正しいキーワードにする。他動詞の後ろに形容詞を持ってこない。 関数ではないのに動詞原形で始まるキーワードを選ばない。
  7. コンパイラは不要なスペースを無視するので、人間にとって読みやすいコードを書きたい。
  8. 余計な変数定義に見えますが、人間にとって読みやすい方が重要です。 今回、usernameは単なる文字列なので良いですが、画像ファイルの中身など、ヘビーなデータを説明変数に代入していいかという疑問がありますが、参照渡しという仕組みによって、実際に新たにメモリスペースにデータを入れるわけではないので、ヘビーなデータでも説明変数は使えます。
  9. コントローラはオーケストラの指揮者のように、一番身軽でいい。 代わりに、Modelやクラスのメソッドを適切に呼んであげること。それがコントローラの仕事。
  10. Fat model, skinny controllerを実践していると、当然モデルファイルが肥大化してくるので、mix-inという仕組みを使います。 module=一個以上のメソッドを定義したファイルで、クラスが読み込んで使えるもの。 railsのconcernはmodelだけでなくcontrollerでも使える。
  11. ・重たい処理をconcernで書くと、concernファイル内に複数のメソッドができる。 concernファイルが複数存在する場合、メソッド名は他のconcernファイルで定義されたメソッドと被ってはいけない。スコープが閉じていない。 そのためメソッドを安易に増やせない力が働くため、必然的にメソッドがFatになり、テストが難しくなることがある。 ・Concernはモデル層に依存する。Service層は何にも依存していないため、副作用が発生しづらいので、再利用が楽。 ・1つのメソッドだけ実行できるクラスという形を取れるので、カプセル性が高い。
  12. ・GoFのデザインパターン23。熟練プログラマが複雑なソフトウェアを書く時、実装方法が似通っていることが知られていた。GoFのメンバーはそれぞれの実装方法をカタログとして23種類にまとめた。 ・SOLID原則 ・Single Responsibility Principle:単一責任の原則 ・Open/closed principle:オープン/クロースドの原則 ・Liskov substitution principle:リスコフの置換原則 ・Interface segregation principle:インターフェース分離の原則 ・Dependency inversion principle:依存性逆転の原則