T_Y_CODE

プログラミング学習記録

学習記録 10日目

10日目の学習記録をまとめていきます。

学習計画

学習内容

オブジェクト指向設計実践ガイド 4章

  • クラス内のインターフェースを実装する際、publicなインターフェースにするかprivateなインターフェースにするか定義する必要があります。
  • パブリックインターフェースには以下の特徴があります。
    • クラスの主要な責任を明らかにする(クラスの単一責任の説明)
    • 外部から実行されることが想定される(依存を想定したメソッド
    • 気まぐれに変更されない (依存されても危険性が少ない)
    • 他者がそこに依存しても安全
    • テストで完全に文書化されてる
  • パブリック以外のインターフェースは全てプライベートインターフェースになる。
    • 実装の詳細に関わる(内部処理。ヘルパーメソッド的なこと?)
    • ほかのオブジェクトから送られてくることは想定されていない
    • どんな理由でも変更され得る (パブリック化すると依存される可能性があり危険)
    • 他者がそこに依存するのは危険 (メソッド内に他者への依存関係があるためチェーンになってしまう)
    • テストでは、言及さえされてないこともある
  • パブリックインターフェースにすることでこのメソッドは安全に依存出来ると使用者に示している
  • 新規アプリケーションを作成する際、必要そうなクラス(オブジェクト)を見つけることから始めがち。そういったオブジェクトはデータと振る舞いの名詞から想像しやすい。
  • 熟練者はオブジェクト間のメッセージに注目している。メッセージに注目することで見つけづらい隠れたオブジェクトを見つけることが出来る。
  • オブジェクトとメッセージを実験するための低コストな方法としてシーケンス図がある。
    • シーケンス図はUMLで定義されている。UMLがサポートする図はたくさんあり、シーケンス図はその内の1つ。
  • よく目にするER図とは違うのか?
    • ER図はデータベース設計で使用する。ERはEntity(実体), Relasionship(関係)の略。全くの無知なのでスキマ時間に以下の記事を読んでみようと思います。

qiita.com

    • シーケンス図はオブジェクト間のメッセージや流れを表現した図。
  • シーケンス図を描く事でパブリックインターフェースを見つけることが出来ます。(シーケンス図に書かれるメッセージは全てパブリックであるべきだから)
  • シーケンス図の例として本書は非常に分かりやすい。4.3の例は何度も読み直したい。
  • シーケンス図の作成は現在VSCodeを使用していることもあり以下を参考にした。

qiita.com

  • パブリックインターフェースに含まれるメソッドは以下のようであるべき
    • 明示的にパブリックインターフェースだと特定できる
    • 「どのように(how)」よりも「何を(what)」になっている
    • 名前は、考えられる限り変わり得ないものである
    • オプション引数としてハッシュをとる
  • Rubyの場合privateやprotectedによって強制される可視性の制限を回避する仕組みも用意されている。つまり、privateやprotectedはあくまで不安定だと示しているだけに過ぎない。たとえばRailsではprivateは使用せず命名規則によってpublic, privateを表している。(先頭が_のメソッドはプライベード)
  • 他のクラスを使用する際はそのクラスを作成したプログラマの意図を考えパブリックメソッドを使用する。
  • プライベートインターフェースへの依存は極力避けること。どうしても、本当にどうしても依存せざるを得ない場合は依存を隔離しリスクを最小限に留めること。
  • デメテルの法則(LOD: Lwa of Demeter)はオブジェクトを疎結合にするためのコーディング規則の集まり。本書では型の異なるメソッドチェーンを行うとそのうちのいずれかが変更された際、メソッドチェーンを使用しているメソッドの変更をしなければならないリスクが増えるためやるべきではないと書かれている。メソッドチェーンを使用するということは使用しているオブジェクトたちを知りすぎてしまっているということ。
  • デメテルの法則について書いている記事をいくつか読みました。

qiita.com
tech-blog.rakus.co.jp

リーダブルコード 15章

  • コメントを残す際、そのコメントで意図が伝わるかどうか同僚などに聞いてみると良い。違った解釈が帰ってくる場合がある。
  • 本章は演習的な内容でした。本質的な内容は上記のコメントの事ぐらいだと感じた。C++で書かれているが大まかにどう動いてるか理解してコードを読んでいった。

スッキリわかるSQL入門 5章

  • SELECTは列に対して演算子の使用が可能。
SELECT 出金額, 出金額 + 100 AS 百円増しの出金額 FROM 家計簿

出力結果

出金額 百円増しの出金額
380 480
0 100
2800 2900
5000 5100
  • CASE演算子は指定列の値に応じて出力結果を変化させる。rubyのcase文に似ている
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

本日の総括

  • オブジェクト間で互いのことを知りすぎない事が大切だと学習した。疎結合になるように意識する。デメテルの法則についてはこれからコードを書く際に意識して書いていきたい。
  • リーダブルコードを読み終えた。Rubyではない言語で書かれていたが本質的な内容は学べたと思う。たまに読み返したいと思う。
  • SQLの関数は他のプログラミング言語とほとんど変わらないのですんなり覚える事が出来た。