msksgm’s blog

Webエンジニアです.日々の勉強,読書,映画観賞,美術観賞の記録を載せます.勉強日記と読書日記は定期的に削除します.

Webアプリ・プログラミング学習メモ(継続 142日目)

今日は,開発手法とテスト手法について学んでいました,

今日取り組んだこと

今後取り組むこと

「オブジェクト指向でなぜつくるのか 第3版」 読書 継続144日目

オブジェクト指向でなぜつくるのか 第3版」[2021, 平澤 章]を読んでいます.

インスタンス変数

  • インスタンス変数の性質
    • 別のクラスのメソッドからアクセスできないように隠すことができる
    • いったんインスタンスが作られたあとは,必要なくなるまでメモリ上に残される
  • ローカル変数とグローバル変数のいいところを合わせている

    • 複数サブルーチンからのアクセス可能
    • アクセス可能範囲の限定ができる
    • 存在期間はインスタンスが作られてから必要なくなるまで
    • 実行時にいくつでも作れる
  • 「長持ちするローカル変数」または「仲間内だけのグローバル変数

三大要素2 呼び出す側を共通するポリモーフィズム

  • 共通メインルーチンを作る仕組み
    • 共通の引数,戻り値を持ったメソッドを作れる
    • 引数や戻り値に実装したクラスを用いることができる

三大要素3 クラス定義の重複を排除する継承

  • クラスの共通部分を別クラスにまとめる仕組み
    • 「継承する」だけで,スーパークラスの変数とメソッドを定義したことになる
    • サブクラス固有の変数とメソッドを定義できる

クラスを型として利用する

  • OOP ではクラスを型として扱うことができる
  • 型チェックの仕組みは,機械語アセンブリ言語の時代にはほとんどなかった.
    • 高級言語や構造化言語でデータ型や構造体をチェックする仕組みを導入
    • OOP ではさらにすすめて,変数やメソッドをまとめたクラスを型として定義することで,コンパイラがチェックできるようになった

さらに進化した OOP の仕組み

パッケージ

  • クラスをさらに「まとめる」仕組み
    • ディレクトリのように階層構造を作ることができる
    • Java では名前の重複を気にせずに再利用できるようになった

例外

  • 戻り値とは違う形式で,メソッドから特別なエラーを返す仕組み
  • 従来のサブルーチンではエラーコードを定義して,サブルーチンの戻り値として返していた
    • 問題点1
      • エラーコードの判定処理をアプリケーションで確実に行う必要があること
    • 問題点2
      • エラーコードを判定する同じようなロジックをサブルーチンの間で連鎖すること
  • 例外による解決
    • 例外は特別なエラーを返す仕組みがあることをメソッドで宣言する
      • 静的型付け言語はコンパイルエラーになる(動的型付け言語は実行時エラー)
    • 例外の必要のないメソッドでは例外の宣言だけをするだけで良い

ガベージコレクション

  • インスタンスをたくさん作ると,メモリをたくさん確保する
    • C 言語や C++では,明示的に開放しなければメモリ確保しつづけていた
  • ガベージコレクション
    • JavaC#などの多くの OOP では,インスタンスを自動で削除する仕組みがある
    • ガベージコレクタと呼ばれる,システムが用意する専用のプログラムがおこなう

OOP の進化まとめ

「オブジェクト指向でなぜつくるのか 第3版」 読書 継続143日目

オブジェクト指向でなぜつくるのか 第3版」[2021, 平澤 章]を読んでいます.

サブルーチンの独立性を高めて保守に強くする

  • サブルーチンの独立性を高めることにより,プログラムの保守性が高まった
    • サブルーチンは,プロシージャ,関数,副手続きなどともいう
    • 独立性を高める方法は,呼び出し側(メインルーチン)とサブルーチンで共有する情報を少なくすること
  • 独立性を高めて,混乱を防ぐ二つのしくみ
    • ローカル変数
    • 引数の値位渡し
      • 戻り値で値渡しをやりとりする

GOTO レスプログラミングを実現する構造化言語

  • 構造化言語
    • ALGOL,PASCAL,C 言語など
    • if 文,case 文,while 文,for 文などを用いて制御構造を記述できるようになる
  • C 言語
    • 構造化言語で最も有名な言語
    • 構造化プログラミングの機能を完全にサポート
    • ビット演算や,メモリ領域を効率的に仕様するためのポインタ機能
    • プログラミングに必要な機能のすべてを言語仕様で提供せずに,関数ライブラリで読み上げるようにした
      • OCOBOL や FORTRAN は printf 関数などの機能を言語仕様として対応している
      • この仕組みは言語コンパイラを改良しなくても,言語仕様レベルの機能追加ができるようになった

進化の方向性は保守性と再利用性重視に変化した

  • 「コンピュータにやらせたい仕事を,いかに簡単に,かつ人間に親やすい方法で」
  • それだけでは「ソフトウェア危機」を解決できなかった
  • グローバル変数問題と脆弱な再利用は課題として残ったままだった
    • グローバル変数を調べる必要があり,サブル=チンはソフトウェア全体でみれば限定的だった
    • こうした問題を打ち破るのが OOP だった

第四章

OOP が持つ構造化言語にはない 3 つの仕組み

  • 「クラス」,「ポリモーフィズム」,「継承」
    • 1990 年代には,しばしばこれらを OOP の三大要素と読んでいた
    • 構造化言語の問題点を解決するための仕組み

OOP の仕組み

  • OOP にはグローバル変数を使わずに済ませる仕組みが備わっている」
  • OOP には共通サブルーチン以外の再利用を可能にする仕組みが備わっている」

  • OOP の仕組みは言語ごとに微妙に異なる

三大要素1 クラス

まとめる

  • 結びつきの強い(複数の)サブルーチンと(複数の)グローバル変数を一つのクラスに「まとめる」ことができる
    • 部品の数が減る
    • メソッド(サブルーチン)の名前づけが楽になる
    • メソッド(サブルーチン)が探しやすくなる

隠す

  • クラスに定義した変数とメソッド(サブルーチン)を,他のクラスから隠すことができる

たくさん作る

  • 一度,クラスとして定義すると,実行時にそこからいくつでもインスタンスを作ることができる
    • 同様の情報を複数同時に扱う処理でも,そのクラス内部のロジックはシンプルにできる

Webアプリ・プログラミング学習メモ(継続 142日目)

今日はサーバーについて勉強していました.

今日取り組んだこと

  • サーバー
    • プロキシサーバ
    • メールサーバー

今後取り組むこと

「コーディングを支える技術」まとめと感想

「コーディングを支える技術」[2013, 西尾 泰和]を読んでいます.

まとめと感想について記述していきます.

概要・まとめ

全体感

本は,プログラミング言語に共通する特性や,枝分かれした特性などの,成り立ちについて学ぶことができます.
主なテーマは,文法,処理の制御,関数,エラー処理,名前とスコープ,型,コンテナと文字列,並行処理,オブジェクトとクラスなどです.
序盤の方はアセンブリや C などの初期に生まれた言語から始まり,そこから派生していった Ruby,Python,Java関数型言語で有名な Haskell などの特徴を交えて解説が進みます.
現在の使用方法にいたるまでに,プログラミング言語のアップデートだけでなく,ハードウェアの進歩,新しい規格の制定が生まれたことを学ぶことができます.
しかし,現在も議論が重ねられている要素があり,それが言語の特有の機能などになっていることわかります.

それぞれの章について

簡単に要約

文法

スタックマシンと FORTH の説明から,文法の始まりについて学びます.スタックマシンの原理は,JavaPythonRuby などといった現代のプログラミング言語にも用いられている.
その後 LISP を経て,様々な論理的な破綻がしない文法が考えられていった結果,FORTRANプログラマが慣れた方法(中置記法)で書くのが一般的になった,

処理の制御

while 文,for 文,if 文以前にあった goto について学びます.
while,for,if はそれぞれ,goto を用いても実装ができますが,可読性が大幅に向上した.

関数

関数は理解と再利用のために生まれました.
関数は意図的にコードの塊をくくり出した名前をつけることで,そのコードが何をしているか把握しやすくなった.
再帰呼び出し」というコーディングテクニックによって,入れ子になったデータを扱うのに適している.

エラー処理

失敗を伝える方法は「返り値で伝える方法」から始まった.
しかし,失敗を見落としたり,エラー処理のせいでエラーが読みづらかったりする問題があった.
そこで,「失敗したらジャンプする方法」が言語(COBOL, PL/I)が生まれ,「失敗の種類を追加できる」,「失敗を発生させられる」要素が,その後の言語(CLU, C++, Java)にも受け継がれている. try-catch-finally は多くの言語で採用されているが,例外処理の結論は決まっておらず,Java の検査例外は他の言語で採用されていない.

名前とスコープ

メモリの場所を指定していたが,わかりづらいので名前を付けたのが変数の始まり.
最初はグローバル変数しかなかった,そのための解決策が「長い変数名をつける」,「スコープを利用する」だった.
スコープで,名前の有効範囲であり,プログラム全体で名前が衝突しないようにする方法.動的スコープは,関数を入り口で元の値をとっておき,出口で書き戻す方法があった.影響範囲が大きかったので,「静的スコープ」が生まれ,今のスコープになった.

型とは人間がデータにつけた「追加のデータ」,元々 0 と 1 で表現するビット列のあつまり.
整数型,不動小数点などを,型によって管理する.
言語に決められた型から,「ユーザ定義型」,「仕様としての型」がつくられ,総称型,ジェネリクス,テンプレートが

コンテナと文字列

プログラミングには,いろいろな種類のコンテナ(配列,連結リスト,ハッシュ,木,辞書など.)が用意されている.それぞれに,メリット,デメリットがある 計算量やメモリの観点から,万能なコンテナはない.

文字は,人間が決めた記号の集合のようなもの.
文字集合で,何が文字であるかを定義し,文字符号化方式で,どうやって文字をビット列に表現するかを考え,文字列の実装では

並行処理

処理を切り替える二通りの方法の「協調的マルチタスク」,「プレンプティブマルチタスク」は,後者が一般的,
リソースを競合させないために,様々な手法が考えられてきた.

オブジェクトとクラス

クラスは言語によって意味が違う.C++では,class はユーザ定義型を作るための仕組みとしたが,オブジェクト指向を作った Alan Kay は「メッセージ」だといった.
クラスは3つの役割をもっており,「まとまったものを作る生成器」,「どういった操作が可能かという仕様」,「コードを再利用する単位」がある.
継承にはさまざまな考え方があり,「一般化・特殊化」,「共通部分の抽出」,「既存のクラスを継承して差分を実装」などがある.しかし,継承をしすぎると深い継承ツリーがうまれ,わかりづらいコードが生まれてしまう.
多重継承は,名前の衝突がおこるというデメリットから,Java では採用されていない.

感想

「コーディング」というタイトルから,vimemacs などのエディターを想像できてしまいますが,まったく関係ありません.
しかし,あくまで「コーディング」なので,コンパイルの方法やメモリの割り当てなどのプログラミング言語と低レイヤーの内容もほとんどありません.

全体的な説明が現在使われるプログラミングの仕様の成り立ちについてなので,業務に役立つ知識があるかと言われたら微妙だと思います.
複数の言語の経験があったら,その仕様の違いについて納得することができる内容が多いです.
業務に関係なく,言語について少しでも詳しくなりたいなら買いだと思います.

全体的に難易度は低く,ソースコードの記述量も少ないです.
言語はアセンブリ,C,haskellPythonJavaScriptJava などが使われいます,私は,C,JavaJavaScriptPython を用いたことがあるのでサクサク読めました.
ただ初版が 2013 年なので,ES2015 以前の JavaScript や Python2 系などと,あまり使わないバージョンが使われていたりや,Kotlin,Go,Rust などのモダンな言語が使われていないので,あまり親しみのない言語しか使っていなかったら,得られる物が少ないかもしれません.