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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

5回答

466閲覧

複数のメソッドを数値だけ変えて実行出来るようにしたい

Phonesuca

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/06/29 07:53

編集2019/06/29 09:11

前提・実現したいこと

現在VB.netでプログラム中のシステムに、
複数メソッドを数値だけ変えて実行する工程があります。

複数のメソッドで同じ数値を使いまわすので、
クラスのフィールドで数値を保持したいと考えておりますが、
中々いい方法が思いつきません。

使用する数値は固定値で、20個程度の数値が2パターンです。

「処理を行うクラスのコンストラクターで分岐させて
数値をフィールドに設定する」
等の処理を考えたのですがいまいちしっくりきません。

C#も分からなくはないので、
VB.net又はC#で教えていただけると助かります。

なにか良い方法があればご教授ください。
よろしくおねがいいたします。

追記(5/29/17:45頃)
現状での設計は以下の通りです。
分かり辛くてすいません。

Class 呼び出し元 Sub 制御メソッド() Dim 処理インスタンスA = New 処理クラス("パターンA") 処理インスタンスA.処理メソッド1() 処理インスタンスA.処理メソッド2() Dim 処理インスタンスB = New 処理クラス("パターンB") 処理インスタンスB.処理メソッド1() 処理インスタンスB.処理メソッド2() End Sub End Class Class 処理クラス ReadOnly Property 数値1 As Integer ReadOnly Property 数値20 As Integer Sub New(パターン As String) If パターン = "パターンA" Then 数値1 = 数値を記載するクラス.数値A.数値1 数値20 = 数値を記載するクラス.数値A.数値20 Else 数値1 = 数値を記載するクラス.数値B.数値1 数値20 = 数値を記載するクラス.数値B.数値20 End If End Sub Sub 処理メソッド1() '処理1 End Sub Sub 処理メソッド2() '処理2 End Sub End Class Class 数値を記載するクラス Enum 数値A 数値1 = 1 数値20 = 2 End Enum Enum 数値B 数値1 = 10 数値20 = 11 End Enum End Class

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/29 08:16

質問者さんがやりたいことを実現するために質問者さんが考えたコードをアップしてください。いまいちしっくりこないものでも良いので。
Phonesuca

2019/06/29 08:48 編集

大まかな処理の流れを質問の下部に追加いたしました。 よろしくおねがいします。
len_souko

2019/06/29 08:57

処理クラスのコンストラクタのelseは書き間違いですよね?
Phonesuca

2019/06/29 09:13

変数名の間違いでしょうか? 気付きませんでした。 Else内で「数値1」を二度セットする処理になっていたので片方を「数値20」に修正いたしました。 ありがとうございます。
YAmaGNZ

2019/06/29 09:49

数値1や数値20は処理クラスでしか使用しないのですか?呼び出し元など他のところでも利用するのですか?
Q71

2019/06/29 14:06

> 複数メソッドを数値だけ変えて実行する工程があります。 > 複数のメソッドで同じ数値を使いまわすので、 数値を変えて繰り返し実行?同じ数値で異なるメソッドを実行?それらが入り混じってる?
Phonesuca

2019/06/29 14:21

呼び出し元では使用しません。 処理クラス内でしか使用いたしません。
guest

回答5

0

ベストアンサー

enum を使う必要があるかないかによってもコードが変わってきます。

C#

1public class 呼び出し元 2{ 3 public void 制御メソッド() 4 { 5 var 処理インスタンスA = new 子クラスA(); 6 処理インスタンスA.処理メソッド1(); 7 処理インスタンスA.処理メソッド2(); 8 9 var 処理インスタンスB = new 子クラスB(); 10 処理インスタンスB.処理メソッド1(); 11 処理インスタンスB.処理メソッド2(); 12 } 13} 14 15public abstract class 親クラス 16{ 17 protected abstract int 数値1 { get; set; } 18 protected abstract int 数値2 { get; set; } 19 protected abstract int 数値3 { get; set; } 20 21 public void 処理メソッド1() 22 { 23 } 24 25 public void 処理メソッド2() 26 { 27 } 28} 29 30public class 子クラスA : 親クラス 31{ 32 protected override int 数値1 { get; set; } = 1; 33 protected override int 数値2 { get; set; } = 2; 34 protected override int 数値3 { get; set; } = 3; 35} 36 37public class 子クラスB : 親クラス 38{ 39 protected override int 数値1 { get; set; } = 10; 40 protected override int 数値2 { get; set; } = 11; 41 protected override int 数値3 { get; set; } = 12; 42}

追記

制御メソッドはループを使いたいですね。

C#

1public class 呼び出し元 2{ 3 public void 制御メソッド() 4 { 5 var instances = new 親クラス[] 6 { 7 new 子クラスA(), 8 new 子クラスB() 9 }; 10 foreach (var instance in instances) 11 { 12 instance.処理メソッド1(); 13 instance.処理メソッド2(); 14 } 15 } 16}

投稿2019/06/29 10:03

編集2019/06/29 10:07
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/06/29 10:11

場合によっては配列でいいんじゃないかと思います。
Phonesuca

2019/06/29 23:41

ありがとうございます! ちょっとC#どころかvb.netも怪しいペーペーなので理解に時間が掛かっていました。 継承ってこういう風に使うんですね… ForEach文で回せるのはとても便利ですね! ちょっと今まで書いてきたコードを思い出して恥ずかしくなってまいりました。 早速明日から活用させていただきたいと思います。
guest

0

そもそも、処理クラスの数値を

VB.NET

1 ReadOnly Property 数値 As 数値を記載するクラス

に変更して、コンストラクタを

VB.NET

1 Sub New(パターン As String) 2 If パターン = "パターンA" Then 3 数値 = New 数値を記載するクラス(数値を記載するクラス.数値タイプ.数値A) 4 Else 5 数値 = New 数値を記載するクラス(数値を記載するクラス.数値タイプ.数値B) 6 End If 7 End Sub

とし、数値を記載するクラスの方を

VB.NET

1Class 数値を記載するクラス 2 Enum 数値タイプ 3 数値A 4 数値B 5 End Enum 6 7 ReadOnly Property 数値1 As Integer 8 ReadOnly Property 数値20 As Integer 9 10 Sub New(タイプ As 数値タイプ) 11 Select Case タイプ 12 Case 数値タイプ.数値A 13 数値1 = 1 14 数値20 = 2 15 Case 数値タイプ.数値B 16 数値1 = 10 17 数値20 = 11 18 Case Else 19 数値1 = 0 20 数値20 = 0 21 End Select 22 End Sub 23End Class

こんな感じにしてみたらどうですか?
値そのものを考えるのは数値を記載するクラスに任せてパターン自体もenumで持っておき、
コンストラクタへパターンを渡すようにします
処理クラスの方では自身の引数からどのパターンなのかを判断するだけにしておきます

質問者さんの提示したソースだとenumの使い方が間違ってますよねってところで意味不明な感じになってるんじゃないかと思います

追記
そもそも、enumの値を数値として使用するってのが本来ではないと思うんですよ
というわけで解凍に書いたenumに値を設定している個所を修正しています
コメントで書いたDictionaryを使用する場合は以下のような感じ
なお、コメントを書いた後にVBだとどうおやるんだっけ?と調べてるのでコメントはC#な表現になっています、VB.NETは10年ぶりくらいなので
でもって本回答のソースはすべてVS2019で実際にVBプロジェクトを作成して実行確認しています

VB.NET

1Class 処理クラス 2 ReadOnly Property 数値 As 数値を記載するクラス 3 4 Enum 数値タイプ 5 数値A 6 数値B 7 End Enum 8 9 Private Shared ReadOnly Property 数値パターン As New Dictionary(Of 数値タイプ, 数値を記載するクラス) From 10 {{数値タイプ.数値A, New 数値を記載するクラス(1, 2)}, 11 {数値タイプ.数値B, New 数値を記載するクラス(10, 11)}} 12 13 Sub New(パターン As String) 14 Me.パターン = パターン 15 If パターン = "パターンA" Then 16 数値 = 数値パターン(数値タイプ.数値A) 17 Else 18 数値 = 数値パターン(数値タイプ.数値B) 19 End If 20 End Sub 21 22End Class 23 24Class 数値を記載するクラス 25 ReadOnly Property 数値1 As Integer 26 ReadOnly Property 数値20 As Integer 27 28 Sub New(数値1 As Integer, 数値20 As Integer) 29 Me.数値1 = 数値1 30 Me.数値20 = 数値20 31 End Sub 32End Class 33

投稿2019/06/29 09:50

編集2019/06/29 20:08
len_souko

総合スコア1348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Phonesuca

2019/06/29 14:20

ありがとうございます。 確かに処理クラス内で数値のセット処理を長々と書いていくのは間違ってる気がしますね。 >質問者さんの提示したソースだとenumの使い方が間違ってますよねってところで これまで数字の定数をグループ単位で扱いたい時に、Enumを使用してましたね… そうか…邪道な使い方だったのか… 本とかウェブサイトとか見ても、列挙体を私が書いたコードみたいな扱い方してないですね… 初歩に立ち返ってみます。
len_souko

2019/06/29 19:51

何が問題かっていうと、数値1と数値20に同じ値を使うパターンが出てきたらどうします?ってところです enumはパターンを区別するものであって、1パターンで設定する各値を定義するものではありません ちなみに上記ソースコードは質問で提示されたソースをベースとしていますのでこの形になっていますが、例えばenumの定義はそのままだけど、数値を記載するクラスをnewする際に引数の数値タイプで値を初期化するつくりではなくコンストラクタの引数に数値1と数値20を渡すようにしてDictionary<数値タイプ, 数値を記載するクラス>を処理クラスのフィールドに持つ方が良いと思います
Phonesuca

2019/06/30 04:59

専用クラスに数値のセットを持たせて、処理するクラスのフィールドにセットするのは良いですね ですが今回は持たせたい数値の数が多く、 コンストラクタの引数で全ての数値を渡すのは管理ができなくなる気がするので、 今回のプログラムでは上のコードの方を参考にさせていただきたいと思います。 ありがとうございました。 >何が問題かっていうと、数値1と数値20に同じ値を使うパターンが出てきたらどうします?ってところです おお… やばい…同じ値があるときでも常習的に列挙体使ってた… 今後はそのような記述はせずに記載してまいります。
guest

0

質問がよく理解できなかったので多分ですが、
呼び出すメソッドは共通にしてメソッドの引数で数値を記載するクラスを利用するのが
まっとうな設計だと思います。
こんなクラスを作っておいて、ParametersクラスのインスタンスはParameters.NumbersAなどで呼びます。

C#

1/// <summary> 2/// 数値を記載するクラス 3/// </summary> 4class Parameters 5{ 6 /// <summary> 7 /// 数値1 8 /// </summary> 9 public int Number1 { get; set; } 10 11 /// <summary> 12 /// 数値20 13 /// </summary> 14 public int Number20 { get; set; } 15 16 /// <summary> 17 /// 数値A 18 /// </summary> 19 public static Parameters NumbersA { get; } = 20 new Parameters 21 { 22 Number1 = 1, 23 Number20 = 20 24 }; 25 26 /// <summary> 27 /// 数値B 28 /// </summary> 29 public static Parameters NumbersB { get; } = 30 new Parameters 31 { 32 Number1 = 10, 33 Number20 = 11 34 }; 35}

余談ですが 日本語のクラスやメソッドはとても嫌われますので、避けることをお勧めします。

投稿2019/06/29 09:08

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2019/06/29 09:10

実は余談が一番言いたいことだったり^^;
hihijiji

2019/06/29 09:18

ちなみに私は学生時代に英語は赤点しか取ったことはありません。 社会人になってからも英語を習ったことがありません。 そんな私でも今では立派なエセ英語使いです。
Phonesuca

2019/06/29 10:03

コードありがとうございます! こういう設計があるなんて知らなかったですし、 C#のプロパティでこういう書き方が出来ること自体知らなかったです。 二重に勉強させていただきました。 普段のコーディングでは英語を使用しているのですが、 今回は実際のプログラムではないので、説明のためにも日本語でいいかなと無精してしまいました。 変数名は英語で書いて、コメントで付記するのが真っ当ですよね。 恐縮です。
guest

0

単にメソッドの引数を変えて呼び出せばいいだけの話なんでは。

#なにをやりたいのかいまいちピンとこない

投稿2019/06/29 09:02

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Phonesuca

2019/06/29 09:22

・同じ数値を同クラス内の異なるメソッドで使いまわす ・一つのメソッドで最大10個程度数値を使用するので、全て引数にするのは避けたい 以上の二つの点からクラス内に使用する数値のセットを保持したいなと考えております。
y_waiwai

2019/06/29 09:25

ならクラス内変数にそれらの数値を保存しといて、メソッド多種からそれらを参照、ということになろうかと。 クラス内変数は別のアクセス用メソッドで値を設定、あるいは動作切り替え?するということで。
guest

0

ぜんぜんピンとこないんですが、同じ数値を使い回す、というのは、最初のインプット1に対して「処理1、処理2...」というデータ処理のフローがあるだけだと思うので、単純に「処理フロー」と「データ」が適切に整理されてれば何も迷うことく、データ件数分処理を回すだけだと思うんですけど。

なんか簡単な話をわざわざ難しく考えてるような…?

投稿2019/06/29 08:48

編集2019/06/29 08:49
gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Phonesuca

2019/06/29 09:07

他の処理では数値は1パターンしかないので、 数値はクラス内に列挙体で持っているんですよね。 他のクラスではクラス内の列挙体を参照して処理を行うのに、 この処理ではフィールドの変数を参照して処理を行う。 だからしっくりこなかったんだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問