質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.05%

クラス内プロパティへの数字(数値)の受け渡し方

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 969

score 73

前提・実現したいこと

例として商品データ受け渡しのためにクラスを作成しました。
クラス内では商品名、数量、価格の3項目を保持します。

ユーザーがフォーム上のテキストボックスへ入力した情報をクラス内変数へ格納するのですが
値のチェックも行いたいと思っています。

クラスのメンバ変数へのアクセスはプロパティのLet、Getステートメントを通ります

発生している問題

数量、価格など計算対象にもなる項目のメンバ変数の型について悩んでしまいました。
以下検討中のパターンです。個人的には【C】のパターンは無いかなと思っており
【A】か【B】のどちらかなのですが・・・
一般的な方法や、自分はこうしている等アドバイス頂けませんでしょうか?

前提:
Variant型は基本使用しない
クラスに受け渡し前の値の型は文字列型/VarType(TextBox1.Value) = 8(文字列型)より
チェック内容は数値であるか、有効範囲内の値であるか等

【A】
・メンバ変数、パラメータは文字列型で宣言
・プロパティ内で数値型へ変換その他チェックを全て行う
・クラス内外で計算に使用する際には都度、型変換して使用する

メリット:チェック内容の記述が1箇所で済む。
デメリット:計算には都度型変換が必要、数の項目を文字列として格納するのに違和感(自分だけかも)

【B】
・メンバ変数、パラメータは数値型で宣言する
・受け渡し前に数値として有効かだけをチェック(渡し時の型エラー予防)
・有効なら型変換してクラスへ格納、その他チェックをプロパティ内で行う

メリット:計算にそのまま使用できる、項目と型で違和感がない。
デメリット:クラスへ渡す前に都度、型のチェックが入る。チェック項目がクラスの内、外に分かれる。

【C】
・メンバ変数、パラメータは数値型で宣言する
・受け渡し前に全てのチェックを済ます
・クラスでは値を保持するだけ

メリット:計算にそのまま使用できる、項目と型で違和感がない。
デメリット:同じチェックの記述がが点在する、クラスの恩恵が薄い。

該当のソースコード

ここにご自身が実行したソースコードを書いてください

試したこと

課題に対してアプローチしたことを記載してください

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

あくまで自分が実装するのであれば、ということで1つの案としてアドバイスさせていただきます。

まずクラス内でのメンバ変数の持ち方ですが、これは数値であるべき変数なら数値型で宣言します。

次にこのメンバ変数を参照するプロパティですが、Let/Getともに数値型で宣言します。
これは数値として扱われるべきプロパティが文字列型での受け渡しになるのは違和感があるからです。

最後に、テキストボックスへの入力値をプロパティにセットするために、もう1つLetを作成します。
文字列型を渡して、数値チェックをしながら数値型に変換するためのLetになります。

以下はチェックは行っていませんが簡単な例です。

クラスモジュール(Class1)

Private numX As Integer 'Xの格納用メンバ変数

'プロパティ:X
Property Get X() As Integer
    X = numX
End Property
Property Let X(i As Integer)
    numX = i
End Property

'文字列型からの変換
Property Let strX(s As String)
    'このサンプルでは数値チェックまではしていません
    numX = Val(s)
End Property

呼び出し側

Sub Test
    Dim c As New Class1

    '文字列で値をセット
    c.strX = "123"

    '数値で値を参照・代入
    c.X = c.X * 2

    Msgbox c.X  '246が表示されます。

End Sub

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/15 22:09

    回答ありがとうございます。
    変換用のLetを置くという発想はありませんでした。
    クラス毎に持っても良いでしょうし、使用規模によっては変換用のクラスを持つのありかもしれませんね。
    考えが広がりました。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る