プリンシプル オブ プログラミング

いくつかの名著で語られている原理原則や文化、思考がよくまとまっていて良かった。 詳細を深堀りしたかったら出典を確認してね、というスタイルの本で、こういうのもアリ。 本書の中で出典としてあがっている「UNIXという考え方」や「リーダブルコード」を既に読んでいたこともあって、すんなりと内容が頭に入って、良い復習になった。(先輩の講義のおかげも多分にある。先輩の網羅性凄い...。)

全体を通して、以下の内容を様々な視点から紹介しており、当然重複もある。多種多様な原理原則があるが、どれも根底には共通部分 (パターン) を持つことが理解できた。

  • プログラムはシンプルに
  • プログラムは読み手を意識して書く
  • 不要な機能は排除する
  • 変更に強いコードを書く

また、プログラミングの世界に銀の弾丸はないということもよく分かった。何かを選択するということは何かを失うことであり、複雑な現実を扱うソフトウェアをすべてシンプルに設計することは不可能。どこかに複雑さを残す必要があり、それをどこに置くかが、プログラマの腕の見せどころ。

仕事でプログラム書きたいな。こういう問題に実際にぶつかってみたい。個人の勉強ではそこまで経験できないから、この先のキャリアを真剣に考えないとな。

Powershellについて (1)

Powershellの扱い方にも慣れてきたので、いろいろとトライアル&エラーしています。

今回は連想配列によるパラメータの記述に関してです。
下の例のように、連想配列はコマンドレットの引数として直接渡すことができます。

$itemParams = @{
        Name     = "test1.txt"
        Path     = "$env:USERPROFILE\Desktop"
        ItemType = "file"
}
New-Item @itemParams

複数のファイルを作成する場合に、連想配列を用いてどう記述すればよいのでしょうか。
下の例のように、単純にパラメータを記述すると当然エラーになります。

$itemParams = @{
        Name     = @("test1.txt", "test2.txt")
        Path     = "$env:USERPROFILE\Desktop"
        ItemType = "file"
}
New-Item @itemParams

New-Item : パラメーター 'Name' で必要とされる型 'System.String''System.Object[]' を変換できません。指定されたメソッドはサポートされていません。
発生場所 行:1 文字:10
+ New-Item @itemParams
+          ~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-Item]、ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.NewItemCommand</span>

やはりパラメータ定義を別ブロックに分ける必要があるのでしょうか…。
あまりエレガントとは言えないですが、下の例のように記述することで2つのファイルを作成することができました。

$itemParams = @{
        Path     = "$env:USERPROFILE\Desktop"
        ItemType = "file"
}
$fileNames  = @("test1.txt", "test2.txt")
foreach ($fileName in $fileNames) {
	$itemParams.Name = $fileName
        New-Item @itemParams
}

連想配列を使うと一目で引数を把握することができるので便利ですね。