スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

VBプログラマーを駄目プログラマーと言わせない 第3回ープログラムの絡みを断ち切ろう

 この記事は、第2回ー標準モジュールを卒業しようの続きです。前回は、標準モジュールについて解説しました。今回は、標準モジュール以外の手段について解説します。
 標準モジュールを多用しがちなVBプログラマーは、次の様なプログラムを書く傾向があります。

'便利モジュール
Module Utility
    Public ReadOnly TaxRates As Single = 0.05
End Module

'冗長な売上明細
Class RedundantSalesDetails
    '単価
    Private m_price As Integer
    Public Property Price As Integer
        Get
            Return Me.m_price
        End Get
        Set(ByVal value As Integer)
            Return Me.m_price
        End Set
    End Property

    '数量
    Private m_quantity As Integer
    Public Property Quantity As Integer
        Get
            Return Me.m_quantity
        End Get
        Set(ByVal value As Integer)
            Me.m_quantity = value
        End Set
    End Property

    '金額
    Public ReadOnly Property Amount() As Integer
        Get
            Dim tmp As Integer = Me.m_price * Me.m_quantity
            Dim tax As Integer = tmp * Utility.TaxRates
            Dim total As Integer = tmp + tax
            Return total
        End Get
    End Property

    '初期化
    Public Sub New()

    End Sub
End Class
この様なVB7以前のプログラミングをやったら駄目です。単純な例なので完全一致する事はないと思いますが、プログラミングスタイルとしては心当たりありませんか?これからこのプログラムの問題点について解説していきます。
 第一に、消費税を標準モジュールに定数として格納してはなりません。前回指摘したように、このプログラミングスタイルでは、何でもUtilityモジュールにぶち込む形式になっています。Utilityモジュールは曖昧なので、プログラマーが便利だと思ったら何でも入れてしまいます。そうなれば、無目的にファイルをマイドキュメントに格納し、ファイルが散らかってしまい管理不能になるのと同様に、プロジェクトに混乱をもたらします。また、消費税の設定方法が固定化されています。
 第二に、非オブジェクト指向プログラミングのスタイルは、非正規化状態になりがちだと言う問題があります。例えば、このサンプルは商品名を忘れています。さらに、商品に新しい属性が追加されたら、その都度プログラムに足していくのでしょうか?そんな状態では、商品に関する仕様が変更される都度、商品を使う全てのプログラムを変更する羽目になります。
 第三に、結局変数を直接操作するのと変わらないという致命的な問題があります。オブジェクト指向プログラミングに馴れていない人は、読み書きOKのプロパティを定義しがちですが、これではフィールド(変数)が自由に操作できてしまいます。これを許すとスパゲッティプログラムになってしまいます。
 この三個の問題は全て、プログラムの結合度が高いのが原因で生じています。結合度とはプログラム間の結びつきの強さの事です。オブジェクト指向プログラミングの目的の一つは、プログラム間の結合を緩める事です。
 このサンプルをオブジェクト指向プログラミングで訂正します。

'税金
Class Tax
    '税率
    Private m_rates As Single = 0.05
    Public ReadOnly Property Rates() As Single
        Get
            Return Me.m_rates
        End Get
    End Property

    '初期化
    Public Sub New(ByVal rates As Single)
        Me.m_rates = rates
    End Sub

    '税金の額を返す
    Function GetTaxValue(ByVal value As Integer) As Integer
        Return Me.m_rates * value
    End Function

End Class

'商品
Class Goods
    '商品名
    Private m_name As String
    Public ReadOnly Property Name As String
        Get
            Return Me.m_name
        End Get
    End Property

    '単価
    Private m_price As Integer
    Public ReadOnly Property Price As Integer
        Get
            Return Me.m_price
        End Get
    End Property

    '初期化
    Public Sub New(ByVal name As String,
                   ByVal price As Integer)
        Me.m_name = name
        Me.m_price = price
    End Sub
End Class

'売上明細
Class SalesDetails

    '数量
    Private m_quantity As Integer
    Public ReadOnly Property Quantity As Integer
        Get
            Return Me.m_quantity
        End Get
    End Property

    '金額
    Private m_saledGoods As Goods
    Private m_taxInfo As Tax
    Public ReadOnly Property Amount() As Integer
        Get
            Dim tmp As Integer =
                Me.m_saledGoods.Price * Me.m_quantity
            Dim tax As Integer = Me.m_taxInfo.GetTaxValue(tmp)
            Dim total As Integer = tmp + tax
            Return total
        End Get
    End Property

    '初期化
    Public Sub New(ByVal saledGoods As Goods,
                   ByVal taxInfo As Tax,
                   ByVal quantity As Integer)
        Me.m_saledGoods = saledGoods
        Me.m_taxInfo = taxInfo
        Me.m_quantity = quantity
    End Sub
End Class

オブジェクト指向プログラミングを行うとこの様になります。2つの新しいオブジェクトとReadOnlyのプロパティが目につくと思います。これから、これにどういう意味があるのかを解説します。
 プログラムの結合度を低くするには、変数の直接使用を避けるのが一番です。その為の仕組みがオブジェクトとプロパティです。これがオブジェクト指向プログラミングの数ある恩恵の内の一つです。
 オブジェクトを定義する意味は大きいです。税金オブジェクトを定義する事により、税金の計算方法に柔軟性がもたらされます。これにより、後で税率をXMLファイルから取得して税金を計算する仕様に変更されても、一か所だけの修正で対応できます。商品オブジェクトも同様の効果をもたらします。商品の属性が追加されても、プログラムの修正範囲が狭まります。この様に、仕様変更による修正箇所が少なくなります
 プロパティを使用する意味も大きいです。プロパティはオブジェクト指向プログラミングのカプセル化の概念を実現するためにあります。カプセル化を簡単に言うと、変数を外部に漏らさず、間接的に変数を操作するようにする事です。これにより、プログラム間の結合度(結びつき)が弱まります。オブジェクト指向プログラミングに馴れたプログラマーが、読み取り専用を多用するのは、よりプログラム間の結びつきを弱くする為です。オブジェクト指向プログラミングの使い手は、どうしても必要になった時だけ、プロパティの書き込みを許します。そうする事により、結合度が低いプログラムが出来上がります。
 オブジェクト指向プログラミングに懐疑的な旧VBプログラマーは思いだして下さい。標準モジュールを使用するきっかけは、スパゲッティプログラムの改善であったはずです。ならば、スパゲッティプログラムを避ける機能を、積極的に使用するべきではないでしょうか?VBは無闇にオブジェクト指向プログラミングをサポートしているのではありません。生産性をあげる便利な機能を、積極的に使用するのがVBプログラマー魂でしょう。少なくとも私は、VBプログラマーをその様に考えています。ただ怠惰なだけなのか、プロとして実利を重んじてVBを選んだのか、それを決めるのは貴方です。続く・・・
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。