『スラスラわかるC#』第1章 読書メモ

『10日でおぼえるC#入門教室』が割と不親切(説明なしに専門用語が出てくる)でつらい感じだったので、改めて入門書を入手しました。

スラスラわかるC# (Beginner’s Best Guide to Programmin)

実を言うと、本書もAmazonレビューでは「プログラミング未経験者には難しい」という評判です。しかし、自分の場合、プログラミング未経験というわけではないので、C#やWindowsアプリケーション特有の概念がちゃんと説明されてれば、オブジェクト指向とかは端折り気味でも構いません。購入のポイントはページ数の少なさ(それでも400ページありますが)と、判型のコンパクトさ。また、ざっと眺めた感じ、『10日でおぼえるC#』で説明されていなかった用語が本書では説明されていたので、『10日でおぼえるC#』よりは説明が丁寧だろう、と。

あと、わからないことを調べる用にVisualC#2013パーフェクトマスターも買いました。こちらは、1000ページ以上あって通読には向かないですが、目次・索引が充実しているのでやりたいことベースで探せるのと、スクリーンショットが豊富なのでVisual Studioの操作がわからない時に使えそうかな、と(Web検索はIDEの操作法を調べるには向かない)。

以下、読書メモ。

.NET Frameworkとは

.NET Frameworkは、アプリケーションの実行基板。仮想実行環境(VSE)、基本クラスライブラリ(BCL)を備えている。

仮想実行環境

C#では、ソースコードをマシン語に変換する前にCIL(Common Intermediate Language, 共通中間言語)に変換する。このCILを実行するのがVSE(Virtual Execution System, 仮想実行環境)。.NET Framework上で動作する言語(C#, VB.NET, F#等)は、全てCILにコンパイルされる。

基本クラスライブラリ

.NET Frameworkに標準で用意されているライブラリ。BCL(Base Class Library)。

Hello, World

Windows 10(Developer Preview) + Visual Studio 2013で一度動かした後、Macでも動くC#開発環境Xamarin Studioを入れて、こちらでも動くのを確認。『スラスラわかるC#』はコンソールアプリケーションがメインのようなので、Windows無しでも学べそう。

Visual Studio賢いとよくいわれるけど、Xamarin Studioも十分に賢いので、C#という言語の仕様自体がIDEに向いている、という感じがある。

『10日でおぼえるC#入門教室』1日目

10日でおぼえるC#入門教室 (10日でおぼえるシリーズ)

次期プロジェクトでC#が必要になったので。。。PMからは「『パーフェクトC#』読んできてね」と言われたんですが、いきなり『パーフェクトC#』はきつそうだったので、新し目の入門書ということで本書をチョイス。

以下、読書メモ。

ビルド

  • コンパイル:ソースをコンピュータが実行できる形式に変換する
  • コンパイラ:変換プログラム
  • アセンブリ:変換した実行可能なプログラム(Unixの世界だとバイナリと呼ぶことが多いと思うけど、Windowsではアセンブリと呼ぶ?)

アセンブリは、拡張子が.exeのファイル。

通常、1つのアセンブリは複数のソースファイル、画像等のリソースファイルから構成される。また、.NET Frameworkのようにソース内で利用する外部のアセンブリ(ライブラリ、拡張子は.dll)を用いることが多い。

個々のソースファイルをコンパイルし、外部のアセンブリの参照を解決し、リソースと組み合わせて1つのアセンブリを出力する作業全体をビルドと呼ぶ。

C# と Visual C

C#は、マイクロソフトが仕様を提案したプログラミング言語。Visual C#は、マイクロソフトによるC#実装。マイクロソフト以外のC#実装としてはXamarin C#がある。

Visual Studioのインストール

Visual Studio 2013 Ultimate Update 4をインストールしたら、インストール量11GBで1時間以上かかりました。。。

ウィンドウ名称

  • デザイナー:WindowsフォームのGUIをWYSISYG編集するためのウィンドウ
  • ソリューションエクスプローラー:プロジェクトのファイルを管理するウィンドウ
  • プロパティウィンドウ:プロパティを編集するウィンドウ

用語

  • プロジェクト:実行ファイル、ライブラリなど、1つの実行ファイルを作成するのに必要となるファイルや設定のコンテナ(.csproj)
  • ソリューション:このソリューションが提供するソフトウェアシステムを構成するプロジェクトを格納するコンテナ(.sln)

ソリューションとは???

デバッガの使い方

「最強IDE」Visual Studioの面目躍如といったところ。言語とIDEとライブラリが高度に結合されているこの感触は、OSSのスクリプト言語などではなかなか味わえない。

『リファクタリング』第3章 コードの不吉な臭い

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

  1. 重複したコード
  2. 長すぎるメソッド
  3. 巨大なクラス
  4. 長すぎるパラメータリスト
  5. 変更の偏り
  6. 変更の分散
  7. 特性の横恋慕:あるメソッドが、自分のクラスよりも他のクラスもつ場合
  8. データの群れ
  9. 基本データ型への執着
  10. スイッチ文
  11. パラレル継承:新たなサブクラスを定義するたびに、別の継承ツリーにもサブクラスを定義しなければならない状況
  12. 怠け者クラス:役に立たないクラスは取り除く
  13. 疑わしき一般化:YAGNI(You Ain’t Gonna Need It)
  14. 一時的属性:インスタンス変数の値が、特定の状況でしか設定されないオブジェクト
  15. メッセージの連鎖
  16. 仲買人:委譲のやりすぎ
  17. 不適切な関係:クラス同士の関係が密接過ぎる場合
  18. クラスのインタフェース不一致
  19. 未熟なクラスライブラリ
  20. データクラス:属性と get および set メソッド以外には何も持たないクラス
  21. 相続拒否:サブクラスが親の属性と操作を必要としない場合
  22. コメント:コメントは不吉な臭いの予兆

これらそれぞれの「不吉な臭い」に関して、それぞれに対処法が書いてあるのだけど、それぞれの対処法についての詳細はまだよく分かっていない(というかこの章の時点では説明されていない)。要再読。

『リファクタリング』第2章 リファクタリングの原則 読書メモ

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

第1章はサンプルコードをベースにした「体験版」的な内容なので、読書メモは第2章から。

リファクタリングの定義

リファクタリング(名詞):外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変化させること。 – p.53

リファクタリングする(動詞):一連のリファクタリングを適用して、外部から見た振る舞いの変更なしに、ソフトウェアを再構築すること。 – p.54

リファクタリングの目的は、ソフトウェアのコードを理解しやすく、変更しやすくすること。そのために重要なのが、外的な振る舞いを保つこと。

コードを書く際には、機能追加とリファクタリングという「2つの帽子」のうち、自分が今どちらの防止をかぶっているのか意識すべき。

リファクタリングを行う理由

  • リファクタリングはソフトウェア設計を改善する
  • リファクタリングはソフトウェアを理解しやすくする
  • リファクタリングはバグを見つけ出す
  • リファクタリングでより速くプログラミングできる:優れた設計は開発が進んでも速度が落ちない

いつリファクタリングをすべきか

  • 3度目の法則:同じようなコードを3回書いたらリファクタリングする
  • 機能追加の時にリファクタリングを行う
  • バグフィックスの時にリファクタリングを行う
  • コードレビューの時にリファクタリングを行う

管理者を説得するには

  • 管理者が品質を重視するタイプなら:リファクタリングを行うことでソフトウェアの品質が向上する点を強調する
  • 管理者が品質よりスケジュールを重視するタイプなら:管理者に無断でリファクタリングする

最も速い方法はリファクタリングです。だからリファクタリングをするのです。 – p.61

リファクタリングの問題点

  • データベースのリファクタリングはソフトフェアに比べると非常に難しい
  • インタフェースの変更:「published」メソッドのインタフェースを変えるのは非常に難しい

「published」とは、publicよりもさらに広く公開され、変更が困難なこと。具体的には、一般公開されているライブラリに含まれるpublicメソッドなど、書き手がそのメソッドの使用箇所を全て探しだして変更することが困難な状態になったメソッドのこと。この場合、インタフェースを変更するなら、古いインタフェースを残しつつ新しいインタフェースを提供する、という形式になる。

  • リファクタリングしにくい設計:どんなに間違った設計でもリファクタリングできるか、という問いに対しては、明確な答えはまだない

リファクタリングを避ける時

  1. 変更するよりも最初から書き直したほうが早い時
  2. 納期が迫っている時:リファクタリングによる生産性の向上は後々効いてくるものなので、納期前にリファクタリングをしても速度は上がらない。

リファクタリングと設計

リファクタリングには、設計を補完する役割がある。リファクタリングを行うことで、事前設計を改善していくことができる。

リファクタリングとパフォーマンス

リファクタリングを行うことで、コードのパフォーマンスが低下することもある。一般に、パフォーマンスの最適化には以下のようなやり方がある。

  1. 時間分割:各コンポーネントが使用可能なリソースの上限を決め、その上限を厳守する。組み込み系などで必要となることがある。
  2. パフォーマンスを常に意識する:コードの全体にパフォーマンス最適化を行う。その結果、コードが読みづらくなることが多い。
  3. 90%の法則:全体の90%は読みやすく保ち、パフォーマンスに影響を与える10%をチューニングする。

Webアプリケーションの場合、パフォーマンスを低下させる箇所は決まっているので、90%の法則が適している。

パフォーマンスチューニングで重要なのは、「推測せず、計測せよ」。

リファクタリングの起源

Smalltalkを使っていたWard Cunningham と Kent Beck が中心的人物。Smalltalkには、コンパイルの速さとオブジェクト指向という、リファクタリングに向いた性質があった。

第1章はいきなりサンプルコードが出てきて、それをリファクタリングしていくという、とても具体的な内容だったのに対して、第2章は抽象的な議論が中心だった。続く第3章は「コードの不吉な臭い」について。

『パーフェクトJavaScript』第1章 JavaScriptの概要

パーフェクトJavaScript (PERFECT SERIES 4)

AngularJSについて学んでいると、JavaScriptの理解が不足しているな、と感じることが結構あるので、AngularJSの学習と平行して↑の書籍を読んでいこうと思います。

ちなみに、私が持っているのは紙の本ですが、技評の「パーフェクト」シリーズは最近電子書籍化されました。直販のGihyo Digital Publishingだと、DRMフリーのePub/PDFが入手できるのでオススメです。


JavaScriptの概要

  • JavaScriptは史上もっとも世界を支配するプログラミング言語になろうとしている
  • JavaScriptの登場は1995年(Netscape Navigator)
  • JavaScriptはECMAScript(ECMA-262、ISO-16262)として標準化されている
  • ECMAScript第4版は存在しない(標準化に失敗)
  • 現在、第5版(第3版と大きな差異が無い)が最新の標準で、第6版が策定中
  • JavaScriptの移植性について問題なのは、JavaScript言語処理系の違いよりも、レンダリングエンジンの違い
  • レンダリングエンジンの差異をなくすために、Acidというテストへの準拠が進んでいる

JavaScript実行環境

  • JavaScriptの言語仕様とDOMは独立している
  • JavaScriptの中で取り替え不能な機能を強調するとき、それをコア言語と呼ぶ
  • JavaScriptには実行環境(ブラウザ、サーバ等)ごとの固有のホストオブジェクトが存在する

JavaScript周辺環境

  • JavaScriptライブラリは、2015年1月現在、jQueryがデファクトスタンダード
  • ソースコード圧縮によって転送量の削減と処理時間の低減を図るのが一般的