Clean Architecture: Chapter 5. Object-Oriented Programming

オブジェクト指向の利点は、ポリモーフィズムのサポートによって、サブモジュールの詳細と独立して上位のモジュールを開発できるプラグインアーキテクチャを可能にしてくれる所にある。

オブジェクト指向設計とは何だろうか?

逆説的な語り口。いくつかの説明がある。

  • 「データと関数の組み合わせ」
    • f(o)の代わりにo.f()と書こう、と言っているに過ぎない
  • 「現実世界をモデリングする方法」
    • 「現実世界をモデリングする」とは何なのかを説明していない
  • カプセル化・継承・ポリモーフィズムという3つのキーワードで語られることがある

オブジェクト指向言語カプセル化・継承・ポリモーフィズムをサポートしているのか

ポリモーフィズムの利点

  • サブシステムの実装に依存せずにプログラムが書ける
    • UNIXが様々なI/OデバイスFILEとして抽象化しており、プログラム側ではデバイスの種類を区別しないで済むのと同じ
  • UIやデータベースをインタフェースを介して抽象化することで、ビジネスロジックがUIやデータベースの実装に依存しない(インタフェースのみに依存する)ようにできる!

Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)

Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)

Clean Architecture: Chapter 4. Structured Programming

  • ダイクストラ (Edsger Wybe Dijkstra) が構造化プログラミングを提唱した
  • ダイクストラは、プログラムの正しさを数学的に証明したいと考えた
    • 数学のように、問題を分割統治していくアプローチを適用したい
    • goto文のある種の使い方は、プログラムを階層的にモジュール化できなくすることを発見
    • 証明可能性を保つ「良い」goto文の使い方は、if/then/elsedo/whileにあたる。
  • BöhmとJacopiniの証明:全てのプログラムはsequence, selection, iterationの組み合わせで作れる
    • これらは全て「証明可能」な構造!
  • 実際には、プログラムの正しさの証明群を整備する数学的アプローチは達成されなかった
  • 構造化/分割されたプログラムをテストする、自然科学的なアプローチに至った 1
    • テストは証明ではないので、プログラムの正しさは保証しないが、間違いを見つけるもの

Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)

Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)


  1. プログラムが物理法則などに、テストが実験に対応する。プログラムは、テストで反例が見つからない限りにおいて正しいとみなされる

自宅iMacのシステム終了/再起動が途中で止まってしまう問題がsudo rebootで解消した

タイトルの通り。↓のブログにも同じ報告がありました。

現象について

いつ頃からか、システム終了 or 再起動すると、全アプリが閉じて画面が真っ暗になった後、電源が切れずに止まったままになる現象が発生。 回避方法は、背面の電源ボタン長押し→少し待ってから電源ON、しかなかった。

ターミナルからsudo rebootすると正常に再起動できた。ターミナルでなく普通にシステム終了 or 再起動した場合も正常になった。謎

Seven Languages in Seven Weeks: Chapter 5. Scala:まとめ/感想

内容

感想

  • アクターモデルの雰囲気を知れて良かった
  • ただし、文法やライブラリについてはほぼ説明が無いため、自分で書けるようにはなれない
    • actor { }で何が起きてるかとか説明なし
  • この本を読んだ上でProgramming in Scalaなどを読めば捗るのかも
  • Scalaはどういう時に使うのがベストなんだろうか?
    • Javaで書かれたプロジェクトを移行するのに使われるとはあまり思えない(わからないけど)
    • 関数型を勉強する目的なら、(Javaとの接続性によってややこしくなってるScalaよりも)他の言語の方が適しているのでは

Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)

Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)

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

  • Scalaでは全てがオブジェクト。Primitivesはない
  • 強い型付け・型推論
  • ifに入れられるのはBooleanのみ。Nilは空リスト。

Loops

  • whileJavaとほぼ同じ
  • forfor(i <- range)という感じで書く
  • ついでに、Scalaでは何も書かないとデフォルトでpublicメソッドになる

Ranges and Tuples

  • untilはexclusive, toinclusive
  • ("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 TrueRingobject TrueRingを定義することができる。この場合、objectの方は"companion object"となり、そこに定義されたメソッドはJavaでいうstatic methodと同様
  • 継承にはextendsを使う。ただしextends Person(name)のように、親クラスのコンストラクタのパラメータを全て指定する必要がある
  • Rubyのmixinに似たtraitを定義できる。
    • with SomeTraitなどと使う

Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)

Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)