月別アーカイブ: 2010年07月

4 posts

Refactor!

VB2008でDeveloper Express社の無料のRefactorを使っていました。
これで重宝しているのは、メソッドの[パラメータ並びのリオーダー]と、
変数とその初期化を1文で書いたり逆をしたり、変数の位置を実行文の近くに移動したり逆をしたり、
プロパティの作成をサポートしたりとかです。

VSプロパーでも[名前の変更]というのがあります。
このチョッとして機能はとてもありがたいです。
名前が不統一のままで開発を進めると、後で自分でつけた名前に苛立ち、変えたくなります。

[名前の変更]は、コントロール名でも、クラス名でも、メソッド名でも、メソッドのパラメータ名でも
一箇所で修正すればスコープを認識して関連する箇所すべてに亘って変更してくれます。
定期的に使ってプロジェクト全体での名前の統一性に気をつけています。

これまでDeveloper ExpressではVB用に無料の版をだしていたのでずっとこれを使ってきたのですが、
VS2010を導入したのを機会に正規版を購入しました。

私のメインのコンピュータには、VS2008とVS2010がインストールされています。
VB2008では無償のRefactorが動いていたのですが、
有償のRefactorをインストールするとおかしくなりました。
VS2010では新Refactorが問題なく動作するのですが、VB2008を立ち上げるとエラーメッセージが出ます。
但し、VB2008でも新Refoctorが動作します。

VB2008用のRefactorをアンインストールしたら、今度はVB2008でまったくRefactorのアドインが読み込めません。
すなわち、VB2008では全くRefactorが使えなくなりました。

開発元のDeveloper Express社に問い合わせましたが、埒が明きません。

再度無償版をインストールすると、VB2008ではOK。
今度はVS2010で全くRefactorが表示されなくなりました。

こちらをたてればあちらがたたず。

Developer Expressの回答待ちです。

Action Pack

注文していたAction Packが届きました。

やるべき仕事があるので、すぐ飛びつくことができませんが、
Visual Sudio 2010をVistaに、Expression WebをXPにインストールしました。

Visual Studio 2010は画面の「雰囲気」が一変しました。
VS2008のプロジェクトは、自動アップデートで問題なく動作するようです。
私はWPFを全くしらないのですが、これがWPFなのでしょうか。
デザイン的には暗い配色で、ヘルプの構成やデザインも変わりました。
デザインは好き嫌いの分かれるところです。
内容はまだよく分かりません。
VBの継続行でアンダースコアを使ってきましたが一部不要になります。
ざっといえば、継続が分かる部分で、例えばメソッド定義でカンマ以下を[C]のように次行に黙って持っていってもよくなります。

VB2008で気に入っているのは、LINQと拡張メソッドです。
この当りがVS2010でどのように進歩したのか、
また添付のInstallShield Limited Editionが使い物になるのか期待しています。

一方、Expression Webはマクロメディア(現在はアドビ)のDreamWeaverやFireworks等に対応していると思います。
少し触っただけですが、私が所有しているDreamWeaver MXに比べて、機能が豊富になっていると感じました。
これも全体が暗い感じのデザインで評価は分かれると思います。
もう一つ感じたのは、「もしかして[重い]かもしれない」ということです。

どちらにしても、今の仕事の片をつけてから、使って行きたいと思います。
楽しみにしています。

開発環境

開発者にとって開発環境を整えるのは、昨今経済的に大きな負担です。

Windowsの場合MSDNを購入するのが最適ですが、これが安くはありません。
開発者が多数であれば全員にそろえるのは会社にとっては頭の痛い問題です。
開発ツールとしては、MSDNだけでなくたとえばSpreadやDreamweaverやPhotoshop
更にはインストールツールの費用もかさみます。

Java環境ではNetBeansやEclipseが無料ですので、
できればJavaで仕事をしたいと考える開発者もいるかもしれません。

Windowsの世界では、Expressエディションが無料ですから、
これはこれで助かります。
SharpDevelopはマイクロソフトが提供するオープンソースで、
これもなかなかしっかりしています。
特にC#-VBのコンバーターが付いていますので、いつか使ってみたいと思います。

インストールツールはWixを注目しています。
これも確かマイクロソフトがベースを提供しています。
インストール条件をXMLで記述しますので、
とても透過性に優れていて好感をもっていますが、
何より情報が少ないのが残念です。
現在の欠点としてプレインストール(SQLサーバー等)の設定が出来ないと思いますが、
Visual Studioとの組み合わせで解決策があるのではないかと期待しています。
VSのインストールプロジェクトで唯一不満なのは、
インストールの途中でプロダクトIDの入力を求める部分の作りで、
公開されている手法は単純すぎるので、プロテクトになっていないのです。
この点が解消されるのであれば、VSのインストールプロジェクトだけで済ましたいくらいです。

さて、私自身数年間MSDNを使っていたのですが、
直近ではMSDNではなくVisual Studioのみ購入しで仕事をしてきました。

そろそろVS2010を使いたくてMSDNの購入を検討していたのですが、
マイクロソフトのAction Packに開発環境が付属していることが分かりました。

Action Packは主に販促用のパッケージだと思いますが、
Development バージョンにはOSやVSの最新版がついています。
とりあえず開発で必要なすべてのツールがそろっているようで、
価格も求めやすく設定されています。
早速注文しました。

FrontPageの後継でしょうか、Expression WebというWeb開発用のツールもあるようです。
わたしはもっぱらDreamweaverを使ってきましたが、
古くなったのでExpression Webを試してみるつもりです。

OOPの工夫

私はFarPoint社のSpread Sheetを多用します。

シートの行を削除したり、コピーやペーストをあちこちの画面(Form)で使いたくなります。このコードをそれぞれの画面で書いていたのでは、メンテナンス上よくありません。

VBでは、共通関数をModuleに書くことはできますが美しくありません。

コントロールに新しい機能追加する一つの方法は、そのコントロールを拡張するカスタムコントロールを作ることです。

しかしカスタムコントロールの作成は少し大げさでメンテナンスに手間取りそうなので別な方法を考えます。いま、これらの処理を受け持つクラス(仮にMySpreadとします)を一つ作ります。

FormではSpreadを配置し、Spreadのデザインやデータの入出力はすべてFormで処理します。MySpreadではSpreadに対応したContextMenuStripのインスタンスを作成し、右クリックしたときのプルダウンメニューの処理をこちらで行うことにします。

FormでMySpreadのインスタンスをつくり、Form上のSpreadとのリンクを付けておきます。

MySpreadの中で行削除や、コピーアンドペースト等のメソッドを準備してやれば、各Formでこれらのコードを書く必要はありません。

Public Class MySpread

    Private WithEvents m_Spd As FpSpread
    Private m_Sheet As SheetView

    Private m_ContextMenuStrip As New ContextMenuStrip
    Private WithEvents m_tsmi挿入 As New ToolStripMenuItem
    '  m_tsmiコピー、m_tsmi切取、m_tsmi貼付、 m_tsmi削除 等以下省略

    Private m_activeRow As Integer
    Private m_コピー元 As Integer
    Private m_コピー中 As Boolean

    Sub New(ByRef Spd As FpSpread, ByVal shtIdx As Integer)
        m_Spd = Spd
        m_Sheet = Spd.Sheets(shtIdx)

        m_tsmi挿入.Text = "挿入"
        m_tsmiコピー.Text = "コピー"
        m_tsmi切取.Text = "切取"
        m_tsmi貼付.Text = "貼付"
        m_tsmi削除.Text = "削除"

        m_ContextMenuStrip.Items.Add(m_tsmi挿入)
        m_ContextMenuStrip.Items.Add(m_tsmiコピー)
        m_ContextMenuStrip.Items.Add(m_tsmi切取)
        m_ContextMenuStrip.Items.Add(m_tsmi貼付)
        m_ContextMenuStrip.Items.Add(m_tsmi削除)
    End Sub

    Private Sub FpSpead_CellClick(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.CellClickEventArgs) Handles m_Spd.CellClick
        If blninit = False Then Exit Sub
        activeRow = e.Row
    End Sub

    Private Sub tsmi挿入_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles m_tsmi挿入.Click
        m_Sheet.AddRows(activeRow, 1)
    End Sub

    ' 	以下省略

    Private Sub tsmiコピー_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles m_tsmiコピー.Click
    End Sub

    Private Sub tsmi切取_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles m_tsmi切取.Click
    End Sub

    Private Sub tsmi貼付_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles m_tsmi貼付.Click
    End Sub

    Private Sub tsmi削除_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles m_tsmi削除.Click
    End Sub

End Class

実はこの話は以前ご紹介しました、[複数コントロールのセットを何度も使う]と内容的には同じことです。この原始的方法は、結構役立ちます。

とはいえOOPの工夫をもっと体系的に研究する必要があると考えています。デザインパターンを少し勉強しましたが、デザインパターンの技術を採用する場面が余りありません。

私のOOPの勉強は10数年前のJavaに始まり、確か2002年ころから.NETを使用してプログラムを書いていますので、特にVB.NETは目をつむっても書けるくらい慣れ親しんでいますが、デザインパターンはほんの一掴みほどしか利用していません。

理由がよくわかりません。一つには私が、デザインパターンを使いこなすほど勉強していないからだと思いますが、開発している内容も向き不向きがあるかもしれません。

ライブラリ等似たような話題が沢山あって、それらを体系的に構築しなければいけないケースでは、確かにインタフェース(に代表されるデザインパターンの技術)をうまく使う必要があると思います。が、10万行にも満たない事務アプリでは、似たようなクラスあるいは幾層もの階層をもったクラスを余り使いません。このようなケースでデザインパターンを使った高級な技術の必要性を感じていません。

それともう一つ現実的な問題として、そのプロジェクトに投入できる技術者の質と量の問題があると思います。マンパワーを十分かけた大きなシステムならいざ知らず、数万行のアプリケーションの作成では、高級な技術者がそろっているわけではありませんので、難しいコードを使うと後々メンテナンスの維持ができなくなる恐れがあります。その意味でできるだけ分かりやすい原始的コードを書く必要があります。

プログラムの評価の本で、[バグを抑えるためにはローテクを使え]というような文章を読んだことがあります。

確かにそうかもしれないと思っています。

だからといってデザインパターンのような体系的なプログラム技術が不要と言う訳ではありません。十分勉強して機会ある毎に利用すべきだと思います。

(ただし、趣味から言うと、私はデザインパターンより、泥臭いがしかし示唆に富んだJoshua Blochの[Effective Java]の方が好きで、さしあたり、この本を熟読玩味するところから始めようと考えています。)