リファクタリング入門 0章

リファクタリングの定義

リファクタリングユニットテスト

振る舞いが変化していないことを確かめるためにもユニットテストが必要。
ユニットテストの対象範囲は「1つのクラス」あるいは「1つのパッケージ」。

リファクタリングを行う際のテストの順序
  1. テスト
  2. リファクタリング
  3. 再度テスト

リファクタリングの目的

バグを見つけやすくる

スパゲッティコードではデバッグも一苦労。

機能追加しやすくする

スパゲッティコードに「機能追加」して更に複雑なコードに。
リファクタリングを行えば機能追加も楽になるネ。

レビューしやすくなる

読みやすい!理解しやすい!

リファクタリングの限界

プログラムがまだ動いていない

リファクタリングは動くプログラムを作ってから。
設計、コーディングがまずく、バグだらけでもできない。

あまりにも時間がない場合

納期直前などの時間がない場合はリファクタリングは行わないようにする。

リファクタリングの「不吉な匂い」

「不吉な匂い」とは
  • 理解しにくい
  • 修正しにくい
  • 拡張しにくい

「わかりにくい」と感じたら不吉な匂いの可能性。

「不吉な匂い」の例

達人プログラマー 第2章

二重化の過ち

DRY(Don't Repeat Yourself)原則(繰り返しを避けること)

「すべての知識はシステム内において、単一、かつ明確な、そして信頼できる表現になっていなければならない。」

  • DRY原則に従うことにより、信頼性の高いソフトウェアを開発して、開発そのものを簡単に理解したりメンテナンスできるようになる。
DRY原則を破る

⇒同じ知識を2か所以上に記述すること。

二重化の発生原因
  • やむをえない二重化
  • 不慮の二重化
  • 手抜きによる二重化
  • 開発者間の二重化

直行性

直行性とは、簡単に設計、製造、テスト、拡張できるシステムを構築する場合に必要となる重要な概念。グラフの座標軸をイメージ。
ある種の独立性、分離性を表す。2つ以上のものごとで、片方を変更しても他方に影響を与えない場合、直行しているといえる。

直行していないシステムの例

ヘリコプター
⇒操作が複雑

直行することの利点

生産性の向上

  • 変更が局所化されるため、開発期間とテスト期間を短縮させることができる
  • 直行性を考慮したアプローチによって再利用も促進される。システム間の結合が疎であればあるほど、再編成や再作成が簡単。
  • 直行しているコンポーネントを組み合わせることによって、生産性の向上が見込める。M × N 種類

リスクの削減

  • コードの問題発生部分を隔離できる。
  • 検証しやすい
  • 特定ベンダー、製品、プラットフォームと強く無図日ついてしまうようなことが無くなる

コーディング
コーディングを行うたびに、意図せずほかのモジュールの中にある昨日を重複させたり既存の知識を重複表現してしまうかもしれない。

直行性を維持するためには?

  • コードの結合度を最小化する。オブジェクトの状態を変更する必要があるのであれば、それをオブジェクト自身にさせる。
  • グローバル・データを避ける
  • 類似機能のリファクタリング
直行性との付き合い方

DRY原則ではシステムないの二重化を最小限に抑える事を目的としているが、
直行性ではシステムのコンポーネント間の依存関係を最小現に抑えることを目的としている。

メモ

オブジェクトのアトリビュートを読み書きする際は、可能な限りアクセッサー・メソッドを使用する

OOPについて その1

OOPの三大要素

「クラス」「ポリモーフィズム」「継承」

クラス
  1. サブルーチンと変数を「まとめる」
  2. クラスの内部だけで使う変数やサブルーチンを「隠す」
  3. 1つのクラスからインスタンスを「たくさん作る」
ポリモーフィズム

サブルーチンを呼び出す側のロジックを一本化する仕組み、
すなわち、「共通メインルーチン」を作る仕組み

継承

クラス定義の共通部分を別クラスにまとめることで、コードの重複を排除する仕組み

数値を右、左詰め、0埋めする方法

右詰め、左詰めする場合、StringクラスのFormatメソッド、PadLeftメソッドを使用する。

指定する書式 書式指定項目の記述例 出力例
幅指定で右詰め String.Format("{0, 4}", num) “___1”
String.PadLeft (4) "___1"
幅指定で左詰め String.Format("{0, -4}", num) “1___”

0埋めする場合、StringクラスのPadLeftメソッドを使用

指定する書式 書式指定項目の記述例 出力例
幅指定で右寄せ0埋め String.PadLeft (4, "0"c) "0001"

PadLeftメソッドでいいですね。

「つまみぐい勉強法」をつまみぐい

問題の解決方法のステップ

  • どういう問題があったか?
  • どうやって問題の個所を特定したのか?
  • どうやって修正方法を特定したのか?

この3ステップを踏むと解決への時間が大幅に短縮される。

質問の仕方

質問する前に現状を把握する。

  • 具体的にどんな作業をしたか?

 ⇒問題に至るまでの過程。問題が起こったらまずスクリーンショットを撮るなどすると説明しやすい。

  • その結果、どういう状態になったのか?

 ⇒現状の結果を整理

  • 本来、どういう状態になりたかったのか?

 ⇒自分が目指していた状態

  • そもそも、何をしたかったのか?

 ⇒目的の整理

わかってはいますが、中々ここまで細分化出来ていませんね。

事実か判断か

事実か判断かの認識がぶれると、後々に影響を与える。
⇒具体的な事実で検討して回避する。数値をで求めたり実際に体感してもらったり。

まとめ

前半は勉強方法。後半は勉強会のお話が中心。個人的にもこの本が書いていることと同じように、2つ3つやることを決めてサイクルで勉強しているので勉強方法に関しては新たな発見はそこまでありませんでした。
勉強会のお話も一般的によく言われているようなことが書かれてありました。((闇雲に)参加するだけではダメだよ等)
兎にも角にも、勉強しましょう。

Excel VBAで.NET(C#,VB)で作成したDLLを使用する方法

実行環境

OS : Windows Server 2003,Windows 7
Excel: Excel2003

準備

C# or VB.NETでDLLを作成。(Test.dll)

②DLLをレジストリに登録し、DLLのタイプライブラリを作成する。
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /tlb Test.dll
ここで「RegAsmは有効なWin32〜ではありません。」とエラーが表示された場合、RegAsm.exeが壊れている可能性がある。(ファイルサイズが0KB)
その際は他マシンからコピペで上記のフォルダに入れる。

③作成したタイプライブラリをVBAの「参照設定」から追加する。
「ツール」→「参照設定」
作成したタイプライブラリを追加するだけでは動かない場合、以下の参照可能なライブラリファイルも追加する。

  • COM + 1.0 Admin Type Library
  • COM AddIn
  • COM+ Services Type Library

VBAでの使用方法

VB.NETソースコード

Import System

Public Class Test
 Public Sub TestMethod()
   MsgBox("メソッドが呼び出されました。")
 Eun Sub
End Class

VBAソースコード

' ダイナミックリンクライブラリ(DLL)の外部プロシージャへの参照を宣言します。
Public Declare Sub TestMethod Lib "Test.dll" ()

Sub CreateTestObject()
' オブジェクト作成 
' 名前空間を忘れがちなので気を付ける
' これでTestクラスのメソッドが使用可能になる
Set QrObj = CreateObject("System.Test")
End Sub

' メソッド使用
Sub VBATest()
QrObj.TestMethod()
End Sub

Visual Studioのセットアップ プロジェクトで作成したインストーラで作成されたショートカットファイルを実行するとインストールが始まる。

タイトルのような現象にハマりました。

解決までに得た情報を纏めます。

なぜエラーなくインストールが完了したのにショートカットを実行するとまたインストールが始まるのか?

Windows Installerで作成したインストーラには、自動修復機能というものがあり、インストール中に何かしら問題があるとこの機能が働くようです。
今回の場合、ファイルシステムに入れていたファイルをインストール中に削除してしまう処理を書いていたため、自動修復機能が働いていました。
仕様変更の際、この処理を削除するのを忘れていたというオチでした…。

セットアッププロジェクトで作成されたショートカットファイルは、アドバタイズショートカット

アドバタイズショートカットについては、下記を参照。
Visual Studio 2005/2008のセットアップ機能で作成したショートカットは「アドバタイズショートカット」となり、出来ない操作がある 【▲→川俣晶の縁側→ソフトウェア→技術雑記】
今回の直接的な原因ではありませんが(?)、このショートカットファイルがアドバタイズショートカットなため、意図しない状況で修復インストールが動いてしまったりするみたいです。
アドバタイズショートカットだと色々弊害があり、出来れば普通のショートカットに修正した方がいいかもしれませんね。

普通のショートカットにする方法は、Orcaを使用すると出来るみたいですが、
このような便利なスクリプトを書いた方もいらっしゃいます。
机の上よりましでしょう:msiのプロパティを書き換える - livedoor Blog(ブログ)