C言語でオブジェクト指向プログラミングは何とかできそうなところまでは分かったのですが、実際どれくらい使われているのでしょうか?
経験から等教えて下さい。
自分の第一感では、ソースとモジュールに分けて、カプセル化・継承ぐらいはやるかもだけど、多態性はコードが複雑になりすぎるのでやらないかな、という感じです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答8件
0
ベストアンサー
C言語プログラムへのオブジェクト指向(設計)適用は、程度の差こそあれ、それなりに行われていると思います。書籍「モダンC言語プログラミング」でも紹介されていますね。
この手の議論では、オブジェクト指向(設計)のような 方法論 と、プログラミング言語が提供する 機能 は分けて考えた方が良いです。既に多数指摘されるように、C言語の言語機能それ自身は、ほとんどオブジェクト指向をサポートしません。C言語で記述するプログラムにオブジェクト指向の考え方(設計)を適用することは可能ですが、言語側サポートが無いため本質的でない煩雑なコードを必要としたり、その設計思想を理解していない将来のメンテナンスによってルールが破られるリスクが高まります。
自分の第一感では、ソースとモジュールに分けて、カプセル化・継承ぐらいはやるかもだけど、多態性はコードが複雑になりすぎるのでやらないかな、という感じです。
仰る通り、C言語でも不透明型(opaque type)によるモジュール化・カプセル化は比較的容易に適用できます。標準ライブラリのFILE*
型+fopen
等の操作関数もこの一種ですね。
継承(inheritance)も、単に構造体(struct
)を入れ子にしてキャスト利用するくらいならたまに見かけますが、仮想関数/動的束縛のような多態性(polymorphism)の実現あたりからC言語では実装が辛くなってきます。それでも、後者はFFmpegライブラリで使われています。
投稿2016/06/13 06:35
総合スコア6189
0
他のコメントを読んでの感想ですが、技術的要因でC++など他のオブジェクト指向言語が選択できない環境ではともかく、政治的理由から「C言語によるオブジェクト指向」を選択するのはまったくおすすめできません。
というのも、C言語でやろうとすれば、
- コードの記述としてはオブジェクト指向の言語でやるよりはるかに冗長になる
- 考え方が変わるコードである以上、勝手に入れるわけにも行かない
- 勝手にやりだしたら、当然「自分以外には理解できない」コードという、チーム開発で作ってはならないものになってしまう
- C言語である以上、保護機構は存在しないので、簡単に「横紙破り」できてしまう
ということで、(勝手にやりだすというパターンを除けば)まだC++を導入するよう説得するほうがいいのではないかと思います。
投稿2016/06/12 03:02
総合スコア145123
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/12 04:11
2016/06/13 12:11
0
こんにちは。
以前、Linuxのカーネルを読んだ時、オブジェクト指向的なプログラムされているなと思ったことが有ります。
データと関数ポインタをセットにしているイメージですね。(仮想関数的なテクニックだったように思います。)
正直、その部分はむちゃくちゃ読みにくいと感じました。(注)
そのポインタに何が設定されているのか追いかけるのがたいへんすぎ。
オブジェクト指向的な記述を多用するのであれば、普通にオブジェクト指向言語を使った方がメンテナンス性は良いと思います。
実際どれくらい使われているのでしょうか?
C++を使えない環境でオブジェクト指向テクニックを使うと何かメリットがある時には必要な部分のみ使われる程度ではないでしょうか?
(注)
でも、誤解のないように補足。Linuxは良いOSと思いますよ。
構造がシンプルなので読みやすいです。ムダに複雑ではないのですよ。
投稿2016/06/12 00:44
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/12 02:27
2016/06/12 03:01
2016/06/12 08:15
2016/06/12 14:59
2016/06/13 00:13
2016/06/13 13:18
2016/06/14 12:22
0
あんまりやってないんじゃないスかねえ。
C言語で無理やりオブジェクト指向もどきを実現さすくらいなら
オブジェクト指向に適した言語や環境を選択するのが吉かも。
プログラムの保守性などは重要なポイントだと思うのですが、
おっしゃるようにオブジェクト指向のメリットを優先させる
ほどの優位性はそんなにない気がします。
あくまでオブジェクト指向の考え方にならえる部分は
ならっておく。と、自分なら考えます。
投稿2016/06/11 23:54
総合スコア7458
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
少なくとも私は使ってないし、周りで使っているのを見たこともないです。
確かC++の一番最初はC言語のプリプロセッサとして実装が始まったはずです。なので、そういうプリプロセッサを準備できれば、と、ふと思いましたが、既に最新のC++コンパイラがあるのにそれをやるメリットが思い浮かびません。
C言語で無理くりやったとしてもオブジェクト指向のメリットを享受できないばかりか、却って生産性を悪くしてしまうと思います。そんな苦労してやるくらいなら、C言語として素直にプログラムしたほうがよっぽど良いと私は思います。
投稿2016/06/13 08:48
総合スコア3579
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
かつて仕事でそのようなコードをメンテナンスしたことがあります。構造体のメンバ変数に関数ポインタを並べてクラスっぽくしていましたが、ポインタはポインタでしかないので、実際にどの関数が呼ばれるかは、「ソースを全検索」してメンバ変数を設定している部分を探さないと判りません。IDEの支援は受けられません。関数ポインタへの設定を間違えてバグを引き起こしていた箇所もありました。
C言語でもオブジェクト指向プログラミングの「真似事」はできるでしょうけど、言語が想定していないことを無理矢理やろうとすると、手間がかかったり可読性が下がったりデバッグが困難になったり、あるいは無用なバグを誘発する危険もあり、かえって生産性を下げることになります。
投稿2016/06/12 03:14
総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
記憶違いかもしれないですが、
printf、sprintf、fprintf等は、vprintfという関数に集約されていたと思います。
( printfからvprintfを呼んでいるし、sprintfからもvprintfを呼んでいる。 )
考え方としては「多態性」になるかと。
投稿2016/06/12 02:32
総合スコア306
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/14 09:40
2016/06/14 14:41
0
OOPの為にC++を作ったのに、何故にCで行う必要があるのでしょう?
今や、マイコンの処理系としても、C++は実装されたりしています。
⇒実用的に使うには、それなりのメモリが必要なので、
遊びのマイコン用途では、C++はあえて使いません。
どうかすると、Cすら除外して、アセンブラ使用を考えたりします。
’
考え方や、プログラミングの方便としては使い処は有ると思いますが、
車輪の再発明という点で、意味があるのでしょうか?
’
takasima20 さんが書かれている様に、OOPが実現できる、処理系、環境を、用途によって
選ぶ方が現実的ではないでしょうか。
’
私的には、MSが .NetMicro Framework と、Senser API の普及への熱意が感じられない、
Windows IOT 系が、中途半端になりそうで、様子見。
⇒何でも良いから、垂直統合が可能な環境、処理系をどうかして欲しい。
Linux / Windows / RTOS / Framework バラバラで、学習コストがかかり過ぎ。
TRONプロジェクトに有った兆しを受け継いでいる物がないかなぁ。
投稿2016/06/12 00:56
編集2016/06/12 01:10総合スコア2028
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/12 02:41
2016/06/12 03:47
2016/06/12 04:17
2016/06/12 07:59
2016/06/12 08:21
2016/06/12 09:17
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。