学習記録 10日目
10日目の学習記録をまとめていきます。
学習計画
- オブジェクト指向設計実践ガイド 4章
- リーダブルコード 15章
- スッキリわかるSQL入門 5, 6章
学習内容
オブジェクト指向設計実践ガイド 4章
- クラス内のインターフェースを実装する際、publicなインターフェースにするかprivateなインターフェースにするか定義する必要があります。
- パブリックインターフェースには以下の特徴があります。
- クラスの主要な責任を明らかにする(クラスの単一責任の説明)
- 外部から実行されることが想定される(依存を想定したメソッド
- 気まぐれに変更されない (依存されても危険性が少ない)
- 他者がそこに依存しても安全
- テストで完全に文書化されてる
- パブリック以外のインターフェースは全てプライベートインターフェースになる。
- 実装の詳細に関わる(内部処理。ヘルパーメソッド的なこと?)
- ほかのオブジェクトから送られてくることは想定されていない
- どんな理由でも変更され得る (パブリック化すると依存される可能性があり危険)
- 他者がそこに依存するのは危険 (メソッド内に他者への依存関係があるためチェーンになってしまう)
- テストでは、言及さえされてないこともある
- パブリックインターフェースにすることでこのメソッドは安全に依存出来ると使用者に示している
- 新規アプリケーションを作成する際、必要そうなクラス(オブジェクト)を見つけることから始めがち。そういったオブジェクトはデータと振る舞いの名詞から想像しやすい。
- 熟練者はオブジェクト間のメッセージに注目している。メッセージに注目することで見つけづらい隠れたオブジェクトを見つけることが出来る。
- オブジェクトとメッセージを実験するための低コストな方法としてシーケンス図がある。
- よく目にするER図とは違うのか?
- ER図はデータベース設計で使用する。ERはEntity(実体), Relasionship(関係)の略。全くの無知なのでスキマ時間に以下の記事を読んでみようと思います。
-
- シーケンス図はオブジェクト間のメッセージや流れを表現した図。
- シーケンス図を描く事でパブリックインターフェースを見つけることが出来ます。(シーケンス図に書かれるメッセージは全てパブリックであるべきだから)
- シーケンス図の例として本書は非常に分かりやすい。4.3の例は何度も読み直したい。
- シーケンス図の作成は現在VSCodeを使用していることもあり以下を参考にした。
- パブリックインターフェースに含まれるメソッドは以下のようであるべき
- 明示的にパブリックインターフェースだと特定できる
- 「どのように(how)」よりも「何を(what)」になっている
- 名前は、考えられる限り変わり得ないものである
- オプション引数としてハッシュをとる
- Rubyの場合privateやprotectedによって強制される可視性の制限を回避する仕組みも用意されている。つまり、privateやprotectedはあくまで不安定だと示しているだけに過ぎない。たとえばRailsではprivateは使用せず命名規則によってpublic, privateを表している。(先頭が_のメソッドはプライベード)
- 他のクラスを使用する際はそのクラスを作成したプログラマの意図を考えパブリックメソッドを使用する。
- プライベートインターフェースへの依存は極力避けること。どうしても、本当にどうしても依存せざるを得ない場合は依存を隔離しリスクを最小限に留めること。
- デメテルの法則(LOD: Lwa of Demeter)はオブジェクトを疎結合にするためのコーディング規則の集まり。本書では型の異なるメソッドチェーンを行うとそのうちのいずれかが変更された際、メソッドチェーンを使用しているメソッドの変更をしなければならないリスクが増えるためやるべきではないと書かれている。メソッドチェーンを使用するということは使用しているオブジェクトたちを知りすぎてしまっているということ。
- デメテルの法則について書いている記事をいくつか読みました。
リーダブルコード 15章
- コメントを残す際、そのコメントで意図が伝わるかどうか同僚などに聞いてみると良い。違った解釈が帰ってくる場合がある。
- 本章は演習的な内容でした。本質的な内容は上記のコメントの事ぐらいだと感じた。C++で書かれているが大まかにどう動いてるか理解してコードを読んでいった。
スッキリわかるSQL入門 5章
- SELECTは列に対して演算子の使用が可能。
SELECT 出金額, 出金額 + 100 AS 百円増しの出金額 FROM 家計簿
出力結果
出金額 | 百円増しの出金額 |
---|---|
380 | 480 |
0 | 100 |
2800 | 2900 |
5000 | 5100 |
SELECT 費目, 出金額, CASE 費目 WHEN '居住費' THEN '固定費' WHEN '水道光熱費' THEN '固定費' ELSE '変動費' END AS 出費の分類 FROM 家計簿 WHERE 出金額 > 0
出力結果
費目 | 出金額 | 出費の分類 |
---|---|---|
食費 | 280 | 変動費 |
教養娯楽費 | 2800 | 変動費 |
交際費 | 5000 | 変動費 |
水道光熱費 | 7560 | 変動費 |
- LENGTH関数は文字列の長さを取得出来る。
SELECT メモ, LENGTH(メモ) AS メモの長さ FROM 家計簿
出力結果
メモ | メモの長さ |
---|---|
コーヒーを購入 | 7 |
1月の給料 | 5 |
- 文字列に対し空白を削除する関数はTRIM関数, LTRIM関数, RTRIM関数。LTRIM, RTRIM関数はそれぞれ文字列に対し左右のみの空白を削除する。
- REPLACE関数は文字列の置換をする関数
SELECT メモ, REPLACE( メモ, '購入', '買った') FROM 家計簿
出力結果
メモ | メモ |
---|---|
コーヒーを購入 | コーヒーを買った |
- ROUND関数は数値の四捨五入を行う。
/* 有効桁数は正の値で少数桁数, 負の場合で整数桁数を表す */ SELECT 出金額, ROUND(出金額, -2) AS 百円単位の出金額 FROM 家計簿
出力結果
出金額 | 百円単位の出金額 |
---|---|
380 | 400 |
1670 | 1700 |
- 指定桁数で切り捨てする場合はTRUNC関数を使用する。
/* 有効桁数はROUND関数と同様の考え方 */ SELECT 出金額, TRUNC(出金額, -2) AS 百円単位の出金額 FROM 家計簿
出力結果
出金額 | 百円単位の出金額 |
---|---|
380 | 300 |
1670 | 1600 |
- 現在の日付を得るには以下の関数を使用する。
CURRENT_DATE -- YYYY-MM-DD CURRENT_TIME -- HH:MM:SS
- CAST関数を使用することでデータ型を変更出来る。
SELECT 出金額, CAST(出金額 AS VARCHAR(20)) + '円' FROM 家計簿
出力結果(INTEGERからVERCHARへ変更された)
出金額 | 出金額 + '円' |
---|---|
380 | 380円 |
1670 | 1670円 |
- 集計関数はデータベースから列データを読み込み1行で出力結果を返す。集計関数はSUM, MAX, MIN, AVG関数がある。処理はEXCEL関数と同じ。COUNT関数は行数を数える関数。データがNULLの行も含める場合はCOUNT(*)と入力する。
- データをグループ化するにはGROUP BY文を用いる。以下の例は費目の内容によってグループ化している。
SELECT 費目, SUM(出金額) AS 費目別の出金額合計 FROM 家計簿 GROUP BY 費目
元のデータベース
費目 | 出金額 |
---|---|
交際費 | 3000 |
交際費 | 1200 |
給料 | 0 |
水道光熱費 | 7560 |
交際費 | 800 |
出力結果
費目 | 費目別の出金額合計 |
---|---|
交際費 | 5000 |
給料 | 0 |
水道光熱費 | 7560 |
- 上記例では出費ではない給料も含まれている。WHERE文で SUM(出費) > 0 とすればいいと思うがGROUP BYはWHEREはデータベースから検索する際の絞り込みとして機能するので上手く機能しない。GROUP BYしてから絞り込みを行うにはHAVINGを使用する。
SELECT 費目, SUM(出金額) AS 費目別の出金額合計 FROM 家計簿 GROUP BY 費目 HAVING SUM(出金額) > 0
元のデータベース
費目 | 出金額 |
---|---|
交際費 | 3000 |
交際費 | 1200 |
給料 | 0 |
水道光熱費 | 7560 |
交際費 | 800 |
出力結果
費目 | 費目別の出金額合計 |
---|---|
交際費 | 5000 |
水道光熱費 | 7560 |