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

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

新規登録して質問してみよう
ただいま回答率
85.48%
インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

ドメイン駆動設計

ドメイン駆動設計(Domain-driven design, DDD)とは、ソフトウェアの設計手法、および設計思想や哲学のことです。ドメインモデル構築の際に、設計上の判断を決定する枠組みとドメイン設計に関して議論するボキャブラリを提供するものです。

Q&A

解決済

1回答

639閲覧

オブジェクト指向でインターフェースから取得すべきオブジェクト

lukkio

総合スコア4

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

ドメイン駆動設計

ドメイン駆動設計(Domain-driven design, DDD)とは、ソフトウェアの設計手法、および設計思想や哲学のことです。ドメインモデル構築の際に、設計上の判断を決定する枠組みとドメイン設計に関して議論するボキャブラリを提供するものです。

0グッド

1クリップ

投稿2022/12/28 01:06

前提

オブジェクト指向を勉強し始めて半年ほどの、プログラミングの初心者です。
インターフェースに対して、どのようなオブジェクトを送ればいいのか迷っています。
1.プリミティブ型
2.値オブジェクト
3.オブジェクトやエンティティ
4.それ以外
どれが良いのでしょうか?

おそらく、インターフェースからの情報取得側によるかと思うのですが、
どれでもいいと思ったときにどれを選んでおけば後々後悔しないか、
常套手段、経験則などを、できましたら理由も添えて教えて頂けると助かります。

該当のソースコードでは
1.プリミティブ型
2.値オブジェクト
3.オブジェクトやエンティティ
でインターフェースから取得していますが、単純に書く量からすると値オブジェクトがすっきりしていますが、
いまいちどれが良いのか解りません。それとも、オブジェクトのライフサイクルで考えるべきなのでしょうか?

オブジェクト指向の書き方そのものがおかしいとの指摘や
前提条件が曖昧過ぎて、どれが最適かこの段階では決められないとの回答でも構いません。
(それはそれであきらめて先に進めます)

pythonで書きましたが、言語は問いません。
宜しくお願いいたします。

実現したいこと

インターフェースに対して
1.プリミティブ型
2.値オブジェクト
3.オブジェクトやエンティティ
どれを送るのがいいのかを知りたい。

該当のソースコード

python

1from abc import ABCMeta, abstractmethod 2import numpy as np 3import matplotlib.pyplot as plt 4import random 5 6"Frontend" 7class Frontend(): 8 def plot_data1(self, data): 9 data = data.get_data() 10 plt.plot(data[1], data[0]) 11 print(type(data)) 12 13 def plot_data2(self, data): 14 data = data.get_data() 15 plt.plot(data.time, data.raw_data) 16 print(type(data)) 17 18 def plot_data3(self, data): 19 obj_data = data.get_data() 20 plt.plot(obj_data.data.time, obj_data.data.raw_data) 21 print(type(data)) 22 23 24"Backend" 25class Interface(metaclass=ABCMeta): 26 @abstractmethod 27 def get_data(self): 28 pass 29 30 31class Primitive(Interface): 32 def __init__(self): 33 self.__data = Data() 34 35 def get_data(self): 36 return self.__data.raw_data, self.__data.time # primitive data 37 38 39class Value(Interface): 40 def __init__(self): 41 self.__data = Data() 42 43 def get_data(self): 44 return self.__data # value object 45 46 47class Object(Interface): 48 def __init__(self): 49 self.__data = Data() 50 51 @property 52 def data(self): 53 return self.__data 54 55 def get_data(self): 56 return self # object 57 58 59"Value Object" 60class Data(): 61 def __init__(self): 62 self.__raw_data = [random.randint(0, 10) for i in range(100)] 63 self.__time = np.linspace(1, 100, 100) 64 65 @property 66 def raw_data(self): 67 return self.__raw_data 68 69 @property 70 def time(self): 71 return self.__time 72 73if __name__ == '__main__': 74 75 primitive_data = Primitive() 76 value_obj = Value() 77 object_data = Object() 78 front_end = Frontend() 79 80 front_end.plot_data1(primitive_data) 81 front_end.plot_data2(value_obj) 82 front_end.plot_data3(object_data) 83

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

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

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

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

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

Zuishin

2022/12/28 01:16

> どれを送るのがいいのかを知りたい。 どれでも好きなのをどうぞ。
yuma.inaura

2022/12/28 01:41

これは何をしているプログラムなんでしょうか?
lukkio

2022/12/28 01:51

> どれでも好きなのをどうぞ。 インターフェースの定石はなく、結局考えても後で書き直すことになるから、 適当でいいということでしょうか? それとも、この違いは後々あまり問題にはならないから、考える必要がないのでしょうか? もし後者であれば気楽に好きなものを選ぼうと思います。 > これは何をしているプログラムなんでしょうか? 質問用に作ったプログラムで、ランダムにデータを作って、pyplotlibでグラフ化しています。 フロントエンドにはpyplotlobでのデータ可視化を想定しております。
Zuishin

2022/12/28 01:59

インターフェースは実装を隠蔽するので、実装がどれであろうとインターフェースの使用には影響しません。 よって、そのインターフェースを使う限りどれでも大丈夫です。
miyabi_takatsuk

2022/12/28 02:07

> インターフェースの定石はなく 要件によりますので、要件ごとのセオリーはあるとは思いますが、 基本的に、要件によって最も適している状態を選択すべきかと。 なので、実装要件の提示がない限りは、Zuishinさんのおっしゃる以上のことは言えません。 よって、既に出ている回答以上はあまり考えられません。
lukkio

2022/12/28 18:23

>そのインターフェースを使う限りどれでも大丈夫です。 >要件によって最も適している状態を選択すべきかと。 ということは、プログラム初心者としてはまずは作ってみて、後で修正するしかないということですね。 ありがとうございます。 回答のコメントでもお聞きしたのですが、 経験上バックエンドからフロントエンドで介するインターフェースで、 取得するのはリストやオブジェクトなど、どれを取得(または送る)することが一番多かったでしょうか?
guest

回答1

0

ベストアンサー

設計によって違うから一概にどれがいいとは言えないと思う。

1つ2つの値を渡すだけのために専用のクラスを作るのはナンセンスだし、まとまったデータならリストなどで渡すほうが扱いやすいでしょふ。また、通常ならインスタンスを渡すところを業務上の都合で中身を取り出してわたすことにしたりなど、設計以外の要因もあったりするかも。

投稿2022/12/28 01:49

TakaiY

総合スコア12765

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

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

lukkio

2022/12/28 18:23

>1つ2つの値を渡すだけのために専用のクラスを作るのはナンセンスだし、まとまったデータならリストなどで渡すほうが扱いやすいでしょふ。 なるほど、取得側の扱いやすさで決めればいいわけですね。 質問なのですが、通常ならインスタンスを渡す場合というのは例えばどういった場合がありますでしょうか? エンジニアではなく業務経験がないので、どういった例があるのかを教えて頂ければ助かります。 あと経験上バックエンドからフロントエンドのインターフェースの場合、 リストやインスタンス、どちらで渡すことが多かったでしょうか?
TakaiY

2022/12/29 01:41

「通常ならインスタンスを渡す場合」 たとえば、ECサイトのユーザ情報とか。 「バックエンドからフロントエンドのインターフェース」 モジュール/サブシステム間のプロトコルになるので、内部のデータとは関係ないことが多いですが、結果として内部のデータがそのまま出ていくことはあるでしょう。 ここではデータ構造はあまり重要ではありません。 通信はシリアライズしたデータで行なうことが多いので。
lukkio

2022/12/29 03:09

>ECサイトのユーザ情報とか。 一意のデータでなく構造体のような情報が必要な時でしょうか。 >通信はシリアライズしたデータで行なうことが多いので。 なるほど、結局送りたい情報が複雑になってくると、情報の復元が必要なので、ひと手間かけることになり、 インターフェースから出てくるデータ構造を吟味する意味はあまりないということですね。 逆にそれほど複雑でないのなら、要件によって適している型があるけれども、 多種多様であり本人にしかわからない、ということですね。 ありがとうございました。 まずは自分のやりやすい方法でやってみようと思います。 質問に書いてくださった方々も、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問