Clean Architecture: Chapter 5. Object-Oriented Programming
オブジェクト指向の利点は、ポリモーフィズムのサポートによって、サブモジュールの詳細と独立して上位のモジュールを開発できるプラグインアーキテクチャを可能にしてくれる所にある。
オブジェクト指向設計とは何だろうか?
逆説的な語り口。いくつかの説明がある。
- 「データと関数の組み合わせ」
f(o)
の代わりにo.f()
と書こう、と言っているに過ぎない
- 「現実世界をモデリングする方法」
- 「現実世界をモデリングする」とは何なのかを説明していない
- カプセル化・継承・ポリモーフィズムという3つのキーワードで語られることがある
オブジェクト指向言語はカプセル化・継承・ポリモーフィズムをサポートしているのか
- カプセル化:0点
- 継承:50点
- オブジェクト指向以前の言語でも継承(多重継承は除く)は実現できてはいたが、より透過的・安全に実現できるようになった
- 多態性:100点?
- オブジェクト指向言語以前から多態性はあった
open()
,read()
などの決まった関数が実装されているものはFILE
とみなせる(つまりFILE
というインタフェース)FILE
はそれらの関数の実体を指すポインタの集まり
- 関数ポインタをプログラマが手動で管理するのは、デバッグ困難でかなり危うい
- オブジェクト指向言語は、ポリモーフィズムを管理してくれる点でメリットが大きい
- 例:C++では
vtable
というテーブルで仮想関数の実体を管理している
- 例:C++では
- オブジェクト指向言語以前から多態性はあった
ポリモーフィズムの利点
- サブシステムの実装に依存せずにプログラムが書ける
- UIやデータベースをインタフェースを介して抽象化することで、ビジネスロジックがUIやデータベースの実装に依存しない(インタフェースのみに依存する)ようにできる!
Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)
- 作者: Robert C. Martin
- 出版社/メーカー: Prentice Hall
- 発売日: 2017/09/20
- メディア: ペーパーバック
- この商品を含むブログを見る
Clean Architecture: Chapter 4. Structured Programming
- ダイクストラ (Edsger Wybe Dijkstra) が構造化プログラミングを提唱した
- ダイクストラは、プログラムの正しさを数学的に証明したいと考えた
- 数学のように、問題を分割統治していくアプローチを適用したい
goto
文のある種の使い方は、プログラムを階層的にモジュール化できなくすることを発見- 証明可能性を保つ「良い」
goto
文の使い方は、if/then/else
やdo/while
にあたる。
- BöhmとJacopiniの証明:全てのプログラムはsequence, selection, iterationの組み合わせで作れる
- これらは全て「証明可能」な構造!
- 実際には、プログラムの正しさの証明群を整備する数学的アプローチは達成されなかった
- 構造化/分割されたプログラムをテストする、自然科学的なアプローチに至った 1
- テストは証明ではないので、プログラムの正しさは保証しないが、間違いを見つけるもの
Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)
- 作者: Robert C. Martin
- 出版社/メーカー: Prentice Hall
- 発売日: 2017/09/20
- メディア: ペーパーバック
- この商品を含むブログを見る
-
プログラムが物理法則などに、テストが実験に対応する。プログラムは、テストで反例が見つからない限りにおいて正しいとみなされる↩
自宅iMacのシステム終了/再起動が途中で止まってしまう問題がsudo rebootで解消した
タイトルの通り。↓のブログにも同じ報告がありました。
現象について
いつ頃からか、システム終了 or 再起動すると、全アプリが閉じて画面が真っ暗になった後、電源が切れずに止まったままになる現象が発生。 回避方法は、背面の電源ボタン長押し→少し待ってから電源ON、しかなかった。
ターミナルからsudo reboot
すると正常に再起動できた。ターミナルでなく普通にシステム終了 or 再起動した場合も正常になった。謎
Seven Languages in Seven Weeks: Chapter 5. Scala:まとめ/感想
内容
- Scalaは、Javaによるオブジェクト指向プログラミングを関数型プログラミングに橋渡しするもの。
- 特に強調されていたメリット
- Scalaの弱点は、Java流の静的型付け、構文のややこしさ、可変性(mutability)。どれもJavaとの接続性から来ているもの。
感想
- アクターモデルの雰囲気を知れて良かった
- ただし、文法やライブラリについてはほぼ説明が無いため、自分で書けるようにはなれない
actor { }
で何が起きてるかとか説明なし
- この本を読んだ上でProgramming in Scalaなどを読めば捗るのかも
- Scalaはどういう時に使うのがベストなんだろうか?
- 作者: Bruce Tate
- 出版社/メーカー: Pragmatic Bookshelf
- 発売日: 2010/11/20
- メディア: ペーパーバック
- クリック: 44回
- この商品を含むブログ (3件) を見る
async/await (JavaScript) の概要
要は
- Promiseありき。Promise無き所にasync/await無し
await promise
と書くと、promise
が解決されるまでそこで待機await
を使えるのはasync
を付けて定義した関数のみ
少し説明
Promise
で非同期処理を逐次つなげると、コールバック地獄にはならないがごちゃごちゃする
// fn1(), fn2(), fn3() の返り値はPromise function sequential(param1) { fn1(param1).then(ret1 => { const param2 = getParam2(ret1); return fn2(param2); }).then(ret2 => { const param3 = getParam3(ret2); return fn3(param3); }); }
async/awaitを使うと、同期処理であるかのように書ける
async function sequentialAsync(param1) { const ret1 = await fn1(param1); // resolveされるまで待つ const param2 = getParam2(ret1); const ret2 = await fn2(param2); const param3 = getParam3(ret2); const ret3 = await fn3(param3); return ret3; }
ざっくり言えば、.then()
の代わりにawait
を使う。
ちなみにasync
を関数の返り値は自動的にPromise
でラップされる。
.catch()
はどう書き換えればよいのか
try-catchを使えばよい
function withCatch() { fn1().then(ret => { return fn2(ret); }.catch(err => { console.log(err); return fn2e(); }); } async function withCatchAsync() { try { const ret = await fn1(); return await fn2(ret); } catch (err) { console.log(err); return await fn2e(); }); }
参考
Seven Languages in Seven Weeks: Chapter 5. Scala: Day 1
Scalaのオブジェクト指向周りについて(Day 2は関数型な部分について)
Scala Types
Loops
Ranges and Tuples
until
はexclusive,to
はinclusive("Elvis", "Presley")
という感じでタプルが作れる
Classes in Scala
class Person(firstName: String, lastName: String)
で、コンストラクタを特に書かなくても値クラスができるclass
宣言直下に書いたコードが"primary constructor"となる。別のコンストラクタを作りたければdef this(...) { }
と書いて"auxiliary constructor"を定義すればよい
Extenging Classes
- companion object
class
の代わりにobject
キーワードを使うと、シングルトンクラスを定義できる- 同名の
class TrueRing
とobject TrueRing
を定義することができる。この場合、object
の方は"companion object"となり、そこに定義されたメソッドはJavaでいうstatic methodと同様
- 継承には
extends
を使う。ただしextends Person(name)
のように、親クラスのコンストラクタのパラメータを全て指定する必要がある - Rubyのmixinに似た
trait
を定義できる。with SomeTrait
などと使う
- 作者: Bruce Tate
- 出版社/メーカー: Pragmatic Bookshelf
- 発売日: 2010/11/20
- メディア: ペーパーバック
- クリック: 44回
- この商品を含むブログ (3件) を見る