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

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

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

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

Q&A

解決済

2回答

5096閲覧

定数はメソッドの引数に渡すべきでしょうか?

oryou

総合スコア15

C#

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

1グッド

0クリップ

投稿2017/08/19 07:00

【質問内容】
定数をメソッドの引数に入れるべきか、それともダイレクトに利用すべきかを悩んでいます。

【現状】
定数はまとめて定数用のConstants.csファイルにまとめています。
定数を利用するメソッドを呼び出すときに、処理内で利用する定数が分かりやすいようにメソッドの引数に入れています。
が、そのメソッドも他のメソッドから呼び出すので大元のメソッドの引数が多くなり、このようなことはやめるべきなのかなと思いましたがどちらがいいのか分からないのでアドバイスをよろしくお願いします。

なぜ定数をメソッドの引数に入れたかというと、外部から入力される値を引数の中に入れておくとコードの可読性が上がるのではないかと思ったからです。

よろしくお願いします。

【例】
※いい処理内容が思いつかなかったのでコード内容がかなり変ですが、定数をメソッドの引数に入れるべきかどうかでアドバイスをお願いします。
CheckPass()メソッドで定数の値チェックを必ず行うようにしています。

C#

1// 定数のみを定義しています。 2namespace ConsoleApplication1 3{ 4 public class Constants 5 { 6 // パスワード 7 public static readonly string PASSWORD = "1234abc"; 8 } 9} 10 11 12using System; 13using System.Text.RegularExpressions; 14using constants = ConsoleApplication1.Constants; 15 16namespace ConsoleApplication1 17{ 18 class Program 19 { 20 static void Main(string[] args) 21 { 22 // ここに定数を入れるべきかを悩んでいます。 23 Show(constants.PASSWORD); 24 } 25 26 // 表示します。 27 public static void Show(string str) 28 { 29 Console.WriteLine(CheckPass(str)); 30 } 31 32 // 文字を削除して数字のみにします。 33 public static string CheckPass(string str) 34 { 35 Regex re = new Regex(@"[^0-9]"); 36 string result = re.Replace(str, ""); 37 return result; 38 } 39 } 40}

上記のようにするよりも以下のようにした方がいいでしょうか?

C#

1// 定数のみを定義しています。 2namespace ConsoleApplication1 3{ 4 public class Constants 5 { 6 // パスワード 7 public static readonly string PASSWORD = "1234"; 8 } 9} 10 11using System; 12using System.Text.RegularExpressions; 13using constants = ConsoleApplication1.Constants; 14 15// 定数はメソッドの引数に入れずにダイレクトに利用しています。 16namespace ConsoleApplication1 17{ 18 class Program 19 { 20 static void Main(string[] args) 21 { 22 Show(); 23 } 24 25 // 表示します。 26 public static void Show() 27 { 28 Console.WriteLine(CheckPass()); 29 } 30 31 // 文字を削除して数字のみにします。 32 public static string CheckPass() 33 { 34 Regex re = new Regex(@"[^0-9]"); 35 string result = re.Replace(constants.PASSWORD, ""); 36 return result; 37 } 38 } 39}
cancat👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

その引数で渡している「定数」以外の値を、その引数へ渡すことはあるのでしょうか? もし、その可能性がないのなら定数を引数で受け取ることは可読性を悪化させると思います。

そもそも引数は異なる複数の値を受け取るためにあります。
ですので、コードを読む人は普通は引数が受け取る値がその定数以外であることも想定して読みます。しかし、定数しか与えないのであればその努力がまるっと無駄になりますから。

投稿2017/08/19 07:14

Chironian

総合スコア23272

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

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

oryou

2017/08/19 12:54

可読性がよくなると思ったのですが、逆に悪くさせてしまうのですね。 アドバイスに従って可読性が悪くなる場合は、メソッドの引数に定数を入れるのやめます。 回答ありがとうございました。
guest

0

定数を利用するメソッドを呼び出すときに、処理内で利用する定数が分かりやすいようにメソッドの引数に入れています。

メソッド内で、どんな定数を利用してるかは、むしろわからない方がよいです。
それに、使う定数が増えるたびに、引数増やすなんて、現実的に不可能かと。

投稿2017/08/19 15:28

momon-ga

総合スコア4820

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

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

oryou

2017/08/20 03:02

定数で引数増やすのは現実的ではないのですね。 メソッドの引数に定数を入れてやればコードを見た人(自分しかいませんが)にはわかりやすいだろうと思っていましたがやめることにしました。 プログラム組んでも1か月後には何を組んでいたのかあまり覚えていないので、できるだけ見直したときに分かり易いようにしようと思ったのですが、逆効果のようなのでやめます。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問