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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト指向

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

6回答

3311閲覧

C++ クラスに属さない関数の是非

pochi_kun

総合スコア36

オブジェクト指向

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3グッド

0クリップ

投稿2019/08/01 11:03

お世話になります。
この度C++でdllの開発を行っており、意見が割れたため、是非いろんな方の意見をお聞きしたく、質問させていただきます。
※インターネット上で検索しても、説得力のある記事をみつけられなかったので…

C++で開発する中で、いろんな場所から呼び出したい共通関数(例えばログ出力処理)を作成しているのですが、これをクラスに属した形で実装するか、クラスに属さない形で実装するか議論になっています。

クラスに属さない派

私はJava出身なので、基本的にOOPばかり行ってきました。
そして、C++もOOPすべき言語だと思っており、クラスに属さない関数という発想ができずにおります…。
(ちなみにC++での開発経験は、1か月ちょっとの初心者です。)
よって、各機能の実装をOOPでクラス単位で実施しているのに、共通関数だけクラスに属していないのは違和感しかなく、実装としてはクラス内でstatic関数で実装するのが正解だと思っています。

クラスに属さない派

昔のC言語の時代からプログラミングしている人は、pLog->Write()みたいな書き方が面倒なので、externしてWriteLog()で呼び出したいということを言っています。
気持ちはわかるのですが、足並みそろえてOOPで実装しているのに、このようなことをしてしまうと統一性が取れないような気がしています。

設計としてどちらがベストプラクティスだと思いますか?
いろんな意見が聞けると嬉しく思います、是非理由を添えてよろしくお願いします。

yohhoy, BluOxy, alphya👍を押しています

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

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

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

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

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

guest

回答6

0

ベストアンサー

こんにちは。

実装としてはクラス内でstatic関数で実装するのが正解だと思っています。

Zuishinさんも書いてますが、オブジェクト指向プログラミングにstatic関数の概念はありません。そもそもstatic関数やstatic変数はオブジェクトに属しませんから。

更に言えば、static関数やstatic変数は、事実上グローバル関数、グローバル変数と同じものです。
クラスに属する必要のないこれらは、名前空間上で直接定義したものと大差ないのですよ。

逆に、クラスに属させる必要がない関数をクラスに縛り付けるのは如何なものか?と感じます。
同じように感じる人も少なくないようで、C言語のグローバル関数はC++ではフリー関数と呼ぶ人も少なくないです。

投稿2019/08/01 12:33

Chironian

総合スコア23272

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

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

pochi_kun

2019/08/01 13:33

「Javaはオブジェクト指向プログラミング言語です」「クラス=OOP」という意識でいたので、Javaで学んだことは全てOOPの範疇だと、頭のどこかで勘違いをしてしまいました。 どちらもOOPの外の話なのに、OOPという単語を使用したことを、大変恥じております。 「フリー関数」というキーワードを教えていただけたので、このキーワードをもとにいろいろ調べて知識を得ていこうと思います。 確かにどちらも大差のない実装方法だとすると、「クラスに属さない派」に書いたような内容も納得がいきました。変にクラスとかいうものに固執せず、PJメンバーで方針を検討していきたいと思います。
guest

0

クラスを使おうが使うまいが、どのみちそれは OOP ではないので、どっちでもいいんじゃないでしょうか。

投稿2019/08/01 11:32

Zuishin

総合スコア28660

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

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

pochi_kun

2019/08/01 13:28

OOPってもう長いこと当たり前のように使っていましたが、多識におっしゃるとおりstatic定義してしまうとその時点でPJ全体がOOPということにはならなくなってしまうんですね。 OOPについてまだまだ知識が足りず、奥が深いと感じました。 勉強して出直します。ありがとうございました。
fana

2019/08/02 00:39

この回答の一文で十分に思えるので高評価.
guest

0

問題・課題が含まれていない質問

teratailは困っている人の質問を解決するサービスです。そのため、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。

に該当する気がしますが、「プロジェクトガイドラインを作る上で困っている」と解釈すれば、まぁ許容範囲なのかなぁ。

「OOPで作る」ことの合意ができている場合に敢えてそれを無視するのは「ベストプラクティス」じゃないと思いますが、C++はCとの互換性もあり、OOPが必須な言語、というわけでもないので、そこら辺の考え方の問題でしかない気が。

特に

そして、C++もOOPすべき言語だと思っており

これって主観でしかないわけで、Wikipediaにも

C++(シープラスプラス)は、汎用プログラミング言語のひとつである。派生元であるC言語の機能や特徴を継承しつつ、表現力と効率性の向上のために、手続き型プログラミング・データ抽象・オブジェクト指向プログラミング・ジェネリックプログラミングといった複数のプログラミングパラダイムが組み合わされている[1]。

と書かれてますし、OOPは主流であっても絶対的な正解というわけではないです。

というわけで、判断基準とするものがない中で、主観による主張だけを集めても無意味だと思いますので、やっぱりこの質問はあんまり意味があるようには思えません。

投稿2019/08/01 11:23

gentaro

総合スコア8949

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

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

pochi_kun

2019/08/01 13:26

確かに、規約スレスレの質問だったかもしれません。失礼いたしました。 OOPでやるかどうかとかそのあたりって、PJで方針を詳細に検討していく必要がありますね。 >「主流であっても絶対的な正解ではない」 OOP基準で考える脳になっていたし、それが現代のベストプラクティスだと思っていた私にとっては、これだけでも意味のある質問でした。 不適切で不快な気持ちにさせる質問でしたら、申し訳ございませんでした。
gentaro

2019/08/01 14:01

別に不快感はないです。結果的に回答がまったく付かないようなものでもなかったので、良かったんじゃないでしょうか。 ただ、個人的には単純にこういう問題提起やらオピニオンみたいな話の場合、Qiitaみたいなサービスを使った方が得られる知見は多いような気がします。
guest

0

原則C++はフリー関数を使うと大体うまくいく言語です。staticメンバ関数はあまり使いません。

投稿2019/08/01 12:13

yumetodo

総合スコア5850

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

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

0

ちょっと実践寄りに考えてみると、たとえばログ出力するにしても

  • 出力先
  • 出力するログの種類や詳細度

みたいなものを指定する機能をもたせたいとか、

  • ログ出力するついでに、出力したログの履歴をメモリ上に取っておいてあとで使う

とか、シチュエーションによってはOOP的に作ったほうか良いかもしれません。上の例だと、引数で都度設定するよりはロガーのインスタンス的なものを作った方がスマートな気がします。下の例も、状態を内部に持たせるならインスタンスですね。

逆に、staticであればOOP的な意味は特になく、名前空間を分けられる程度のメリットしかないので、そこに価値を見いださないのであれば(Javaなどのグローバル関数が定義できないどちらかといえば特殊な言語を使うのでなければ)グローバル関数で書くのが普通だと思います。

投稿2019/08/01 18:37

hayataka2049

総合スコア30933

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

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

0

回答とも言い難いけど、他の人のコメントに書くのもナンなので。

static定義してしまうとその時点でPJ全体がOOPということにはならなくなってしまう

オブジェクト指向ってそうやって純血を守らなきゃ保てないものなの? それだけで意味がなくなってしまうものなの?
んで、オブジェクト指向かどうかの基準はクラスを使ってるかどうかなの?
オブジェクト指向原理主義...とか思ってしまった。

(私がオブジェクト指向を習ったときは、クラスはオブジェクト指向の設計を実装するのに便利な仕組みだけど、クラスを使えばオブジェクト指向ということじゃない、クラスを使った手続き的プログラムなんていくらでも書けるし、逆にCでもオブジェクト指向的に書けないわけじゃないんだよ、と散々釘をさされたけどなぁ。)

投稿2019/08/02 12:13

thkana

総合スコア7639

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

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

Zuishin

2019/08/02 12:18

その部分には説明が面倒なので触れなかっただけです。大荒れするテーマなので。
Zuishin

2019/08/02 12:22

「これがオブジェクト指向だ!」というのはここでちょこちょこっと個人的イメージを書きなぐるのではなく、資料を揃えて Qiita などで詳細に書かれるのがいいかと。
thkana

2019/08/02 13:12

まぁ、そうなりますかねぇ。>荒れる staticがある->オブジェクト指向では全く無い、みたいな展開はあんまりだと反応しちゃいましたけど、あんまり深く突っ込みたくないです。 私自身はオブジェクト指向絶対主義でもないし、「俺は正しい/お前が間違っている」でやり合う根性もないし
Zuishin

2019/08/02 13:35

static メソッドがあるからオブジェクト指向でないのではなく、static メソッドはオブジェクト指向ではないということです。オブジェクトが無いので。
thkana

2019/08/02 14:07

そこのリクツは了解。 まぁ、これ以上触らないほうがいいかな(笑)
Zuishin

2019/08/02 14:08

喧嘩を売りたいなら買いますが。
Zuishin

2019/08/02 14:09

とりあえず回答ではないただのいちゃもんとわかったので低評価しときます。
Zuishin

2019/08/02 14:14

マルチパラダイムという言葉を知らなければ調べておいてください。シュクダイです。これ以上は触らない方がいいかな。
thkana

2019/08/02 14:17

え? 喧嘩? 自分でも回答とするにはちょっとアレかなぁ、と思っているので(全然ダメとも思わなかったけど。で、回答の最初にそう書いた)そう評価されるのは甘んじて受けます。
Zuishin

2019/08/02 14:19

やっぱりこのヒトは触らない方がいいみたいですね。
gentaro

2019/08/02 14:44

thkanaさんが喧嘩を売ってるようには見えないけど、「リクツ」とか(笑)とか、読む相手にとっては馬鹿にしてるように見える場合があるので、そこじゃないかと。 「文章では相手の表情とか言葉のトーンが伝わらないからネット上での言葉の使い方に気をつけようね」みたいなことは割と言われているので、その典型的な事例っぽい。
thkana

2019/08/02 14:47

確かにそうですね。はい、今後気をつけます。
thkana

2019/08/02 14:53

不適切な表現で御不快にさせておりましたら謝罪いたします>Zuishinさん
Zuishin

2019/08/02 14:56

私ももし不適切な表現で御不快にさせておりましたら謝罪いたします。>thkana さん
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問