LoginSignup
aono1234
@aono1234 (青野 健)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

クラスの設計

クラス設計のやり方がわからない

今まで、変数や関数だけでコーディングをしていましたが、
可読性が悪く、クラスを作って可読性が向上できないかと思い、クラス設計にチャレンジしているのですが
いまいち、どのようにクラスを設計すればよいかわかりません。

よく、車を例に以下のような説明があります。車に関しては
すでに現実世界にある概念なのでクラスのイメージがしやすいです。

class car{
	constructor(name,ridingNunmberOfPeople){
		this.name=name;
		this.ridingNunmberOfPeople=ridingNunmberOfPeople
	}
	run(speed){
		console.log('最高速度'+speed+'km/hで走行');

	};
}

const car1 = new car("トラック",3);
const car2 = new car("軽自動車", 5);
console.log(car1);//{name: 'トラック', ridingNunmberOfPeople: 2}
console.log(car2);//{name: '軽自動車', ridingNunmberOfPeople: 5}
car1.run(100);//最高速度100km/hで走行
car2.run(80);//最高速度80km/hで走行

私が作りたいクラスは、車のような分かりやすいものではなく
「グラフを切り替えるための機能がまとまったもの」をクラスにしたいと考えております。

【イメージ】
①「期間」というテキストボックスに数値をinput。
② ①の数値の単位が年単位なのか月単位なのか日にち単位なのかをinput。
③ 「期間」がどこからスタートなのかを選ぶ。
④ グラフのX軸の表示を更新
みたいな処理をクラスで作りたいと思っております。

車のようなわかりやすい概念ではないため、どのようにクラスを設計すればよいか困っております。
この場合、皆様はどのようにしてクラスを設計しますか?

そもそも、「処理をまとめるために」処理にフォーカスしてクラスを作る考え方が違うのでしょうか?
「もの」という概念をまず固めて、概念に対しフォーカスしてクラスを設計し、
その概念からあぶれた処理はクラス内に記載せず、別途関数で定義するみたいな感じなのでしょうか?

質問が冗長で申し訳ありません。
ご教授いただけると幸いです。
(クラス設計とテーブ設計は似ている?)

0

2Answer

MVC (Model, View, Controller) に分けるくらいは学んでおきましょう。
MVC以外に MVP, MVVM といった分け方もあります。

「オブジェクト指向設計」でネット検索すればいろいろ学べますよ。
以下の用語に関しても検索して学んでみるといいです。

  • ヘキサゴナルアーキテクチャ
  • クリーンアーキテクチャ
  • SOLID原則
  • DDD (Domain Driven Desing、ドメイン駆動設計)
  • UML (Unified Modeling Language)
1

Comments

  1. @aono1234

    Questioner
    ご回答ありがとうございます。当方、理系出身ではありますが、プログラミングに関してはど素人なのでそのようなキーワードを教えていただけるだけでも大変ありがたいです。

作りたいものの全体像が見えないので、適切なアドバイスになるかわからないですが、以下のことをされてはいかがでしょうか?

  1. 機能と属性に分ける
  2. 機能と属性をセットにしてオブジェクトを考える
  3. オブジェクトの責任範囲を明確にする
  4. オブジェクトを抽象化する

おそらく、「グラフに表示する源泉データを、様々な条件で絞り込みたい」といったものだと思います。例えば以下のような。

  • 期間で絞り込む
  • 特定の数値データの上下限で絞り込む
  • 文字列の一部一致で絞り込む

例えば、期間で絞り込むであれば、「開始日時」「終了日時」「対象列」が属性で、「絞り込む」が機能になります。

とすると、オブジェクトは「日付フィルター」というオブジェクトが考えらます。

このオブジェクトの責任は対象データを日付で絞り込む責任を負います。数値や文字列などの絞り込みは負わない。

そして、他の絞りこみについても、同様に数値フィルター、文字列フィルターみたいになります。

そうすると、グラフから見て個々のフィルターは「フィルター」という抽象的なオブジェクトとしてとらえることができます。

グラフは、フィルターに表示用のデータを渡し、フィルター内で設定された条件にそって、表示用のデータが戻され、グラフはそのデータを使って再描画する。(再描画はフィルタの責任ではない)
といった、考えでいかがでしょう?

1

Comments

  1. @aono1234

    Questioner
    ご教授ありがとうございます。当方がやりたいことを言語化して頂きありがとうございます。やりたいことと完全合致しております。

    「3.オブジェクトの責任範囲を明確にする」というところは目から鱗で、その考え方が私にはありませんでした。クラスの範囲をどこまで細分化するか、というのが明確にイメージできました。これでクラス設計の神髄に一歩近づけました、ありがとうございます!!

Your answer might help someone💌