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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

0回答

743閲覧

(インスタンスを作成しない)静的クラスにおいて、メンバ変数は作成しない方が良いでしょうか。

kurisan1623

総合スコア36

C#

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/12/12 14:53

編集2022/01/12 10:55

自分はPHPで書きますがC#も一応読めます。

知りたいこと

静的クラスにおいて、下記のどれが良いか
0. メンバ変数を作成しない

  1. メンバ変数を作成する
  2. 作成する場合、「メンバ変数にset」と「戻り値からget」のどちらで値を取得すべきか

コードの例

$hogee1,$hogee2,$hogee3はどれも似たような(グループにできる)データです。

コード1
メンバ変数を作成しない=メソッドのみである。
メソッド間のデータの受け渡しは引数を利用する。
getメソッドを利用する。

PHP

1class Hoge 2{ 3 public static function main($url) 4 { 5 $object = Graph::fetch($url); 6 7 $hogee1 = self::getHoge1($object); 8 $hogee2 = self::getHoge2($object); 9 $hogee3 = self::getHoge3($object, $url); 10 11 $foo = $hogee1.$hogee2.$hogee3; 12 13 return $foo; 14 } 15 16 private static function getHoge1($object) { 17 return $object->hogee1 . 'aiueo'; 18 } 19 //private staticなメソッド定義の羅列 20} 21 22$a = Hoge::main('URLデス');

コード2
メンバ変数を作成する。
メソッド間のデータの受け渡しはメンバ変数を利用する。
setメソッドを利用する。(getでreturnでも可)

PHP

1class Hoge 2{ 3 private static $object; 4 private static $url; 5 6 private static $new_object; 7 8 public static function main($url) 9 { 10 11 self::$url = $url; 12 self::$object = Graph::fetch(self::$url); 13 self::setHoge1(); 14 self::setHoge2(); 15 self::setHoge3(); 16 17 $foo = self::$new_object->$hogee1.self::$new_object->$hogee2.self::$new_object->$hogee3; 18 19 return $foo; 20 } 21 22 private static function setHoge1() { 23 self::$new_object->hogee1 = self::$object->hogee1.'aiueo'; 24 } 25 26 //private staticなメソッド定義の羅列 27} 28 29$a = Hoge::main('URLデス'); 30

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

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

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

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

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

Zuishin

2019/12/12 15:45

関数とグローバル変数を使ったプログラミングですね。40 年くらい前のやり方です。
kurisan1623

2019/12/12 15:53

すごい昔ですね。。よっぽどひどいと受け止めますw では、現在の良いやり方だとどんな感じになりますでしょうか。。
Zuishin

2019/12/12 16:15

静的なメソッド・変数のみを使っている場合、プログラム全体のどの部分からもデータを変更できてしまうので、一度トラブルが起こるとプログラム全体を見直さなければなりません。誰でも手に取れるところに財布を置いているようなもので、犯人候補が多すぎて特定が大変なのです。 そこでなるべく小さなスコープにデータを隠蔽します。この質問のコードでも private を使っていますが、private を使うことによって public より影響範囲を減らすことができます。 しかし private にしても静的メソッドから簡単に変更できてしまいます。そこでインスタンスを作り、それをローカル変数に入れることにより、他のインスタンスから独立してデータを保持できるので、影響範囲を更に小さくすることができます。 また、そこで使われているデータ自身もメンバ変数でなくローカル変数を使うことで、影響範囲をもっと小さくすることができます。 このように、影響範囲を可能な限り減らすようにプログラミングする方がよりモダン(モダンというほど新しくはありませんが)です。
kurisan1623

2019/12/12 16:47

なるほど、スコープは小さくという原則をクラスで全く考えていませんでした。ありがとうございます。 ということはコード2は論外ですねw コード1はどうでしょう。 クラスにプロパティはなく、関数の集合版のような感じで、変数の生存もメソッド内のみです。 これだと問題はないでしょうか。
m.ts10806

2019/12/12 21:11

言語関係なく「オブジェクト指向」の問題とした方がより広い知見を得られると思います。
Zuishin

2019/12/12 21:23

場合によっては使えますが、関数の集合体であるクラスは神クラスになる危険がありますし、オブジェクト指向プログラミングにはなりません。それを基本にクラスを作成していくのは感心できません。
kurisan1623

2019/12/13 01:27

分かりました。 もう少し調べていい方法を模索します。 長々とお付き合いいただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問