検索して色々調べてみたのですが「結局どちらもかわらない」との意見が殆どでした。
私もプログラミング効率や保守・管理の手間はどちらも変わらないと思います。
まず、前提ですが、
・関数型とは Lisp 等の関数言語ではなく、C のようなオブジェクト指向でない言語を示す
ということで書いてみます。
Cで関数を書いてゆくのは、ある意味「プログラム全体を1つのオブジェクトとして記述する」ということになると思います。ですので、規模によってはわざわざクラス設計するより、面倒がなくて良いかもしれません。しかし、それなりのプログラム構成がちゃんと設計できていないと、後々面倒なことになるのは当然のことかと思います。
ではオブジェクト指向技法を用いることだけで変わるか、というとNOと言わざるを得ません。おかしなクラス設計は、生産性を向上させるどころか低下させることも普通にあります。適切なクラス設計を行い、どこでどのレベルの機能を提供するか、それをちゃんと設計できる必要があります。
個人的に、十分に小さいシステムならCでがりがり書いたほうが開発自体は早いと思います。
またシステム規模が大きくなれば、システムを正しく分割し、分割された機能をそれぞれ正しくオブジェクト指向的に抽象化し、良いAPIを提供する設計ができれば、生産性、保守性共に良いものができると思います。
良い設計ができるならオブジェクト指向のほうが良いものができると思いますが、単なる技法の差以外の部分の影響の方が大きいと考えています。
オブジェクト型と関数型ですか、私はどちらの手法でも開発してますけれども、個人的にはこう考えてます。
オブジェクト型だと、同じ構造体とそれらを拡張した構造体をもったデータの管理が楽です。
たとえば洋服のデータ管理で、
[服]
+[男性向け]
+[女性向け]
+[子供向け]
みたいにオブジェクトを作るわけですが、たとえば洋服って男女で号数ちがいますよね。オブジェクト型だとその差を吸収できます。
プログラム側では、[服]を管理するだけで、その派生である[男性向け][女性向け][子供向け]を意識する必要がなくなります。
これがオブジェクトでない方法を使うと逆に男性女性子供の違いを考慮した管理関数を用意しなければなりません。
…とこういう回答でよろしかったでしょうか?
確かに、継承が可能なのでその点は便利ですね。
また、ソースコードも短くなるのでよいかもしれません。
しかし継承での最大のデメリットは親を改変した時、継承を使いまくっていると互換性を高める必要がでてくるところでしょうか。
使い分けが重要なのかな?
回答の意図はOKです。ありがとうございます。
質問を補足すると、「オブジェクト指向がいいよ」と言っている人をたまに見かけるので
なぜそこまで「オブジェクト指向」を薦めるのかを疑問に思っていました。
オブジェクト指向、関数型に関して客観的な回答を求めています。
「保守・管理」の面で考えると
main関数に全てのロジックを突っ込むため、ソースコードの規模が大きくなるほど保守が難しいと思います。
ロジックを適切なクラスに分けて設計できるため、保守が容易であると思います。しかし、複雑なロジックで継承を利用する場合、継承構造が深くなり、サブクラスから親クラスをコールするような依存循環構造が発生して、手に負えなくなってくることもありますが・・・。
こんなところでしょうか。「プログラミング効率」は扱うシステムによって異なるのではないでしょうか。
なるほど、mainメソッドのことをすっかり忘れていました。
「関数型よりオブジェクト指向の方がいい」という暗黙の了解があるかと思いました。
結局のところ、設計によって異なるということですね。
その、設計にマッチしたプログラミングをするべきなのですね。
当たり前なんですけど、何が最適なのかは難しいところですよね。
まだまだ、回答募集していますよ!!
あの、回答2を見る限り、C言語みたいなのを関数型言語と言っておられるのかもしれませんが、関数型言語というのは、http://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%8...こういうのです。LISPとかそういう系統の言語です。
C言語みたいなのが関数型だとするなら、関数を集めてオブジェクトとして使えるのがC++であり、オブジェク指向言語です。
>私もプログラミング効率や保守・管理の手間はどちらも変わらないと思います。
オブジェクト指向を有効に使えば違います。オブジェクト指向は、C言語とかの手続き型言語の保守・管理のしにくさを改善するためにできてきたものです。厳密にいうとオブジェクト指向の法が実行速度の面で不利な面があります。
言語ではなく、技法ですね。(プログラミングは技法でいいのかな?)
オブジェクトとして利用できる言語でも、関数にして呼び出しているものとオブジェクトにして呼び出していることに明確な違いがあるのかという疑問でした。
わかりにくくて、すいません。
>>厳密にいうとオブジェクト指向の法が実行速度の面で不利な面があります。
これは知りませんでした。
厳密とおしゃっているので、微々たる差なのでしょうか。
まず、前提ですが、
・関数型とは Lisp 等の関数言語ではなく、C のようなオブジェクト指向でない言語を示す
ということで書いてみます。
Cで関数を書いてゆくのは、ある意味「プログラム全体を1つのオブジェクトとして記述する」ということになると思います。ですので、規模によってはわざわざクラス設計するより、面倒がなくて良いかもしれません。しかし、それなりのプログラム構成がちゃんと設計できていないと、後々面倒なことになるのは当然のことかと思います。
ではオブジェクト指向技法を用いることだけで変わるか、というとNOと言わざるを得ません。おかしなクラス設計は、生産性を向上させるどころか低下させることも普通にあります。適切なクラス設計を行い、どこでどのレベルの機能を提供するか、それをちゃんと設計できる必要があります。
個人的に、十分に小さいシステムならCでがりがり書いたほうが開発自体は早いと思います。
またシステム規模が大きくなれば、システムを正しく分割し、分割された機能をそれぞれ正しくオブジェクト指向的に抽象化し、良いAPIを提供する設計ができれば、生産性、保守性共に良いものができると思います。
良い設計ができるならオブジェクト指向のほうが良いものができると思いますが、単なる技法の差以外の部分の影響の方が大きいと考えています。
少しスッキリしました。
オブジェクト指向を取り入れるだけでは何もかわらないということですね。
何でもそうですが、使いようが大事ですね。
大規模な開発にはもちろん、適切なシステム細分化と抽象化は大事ですね。
もう既に何人の方が指摘されているようですが、Cなどのプログラミング言語を
関数型と呼ぶには語弊があります。
これらは手続き型言語と呼ばれています.
参考:http://e-words.jp/w/E6898BE7B69AE3818DE59E8BE8A880E8AA9E.html
関数型言語はLisp,Haskellなどのプログラミング言語を指し,
手続き型言語,オブジェクト指向言語とは非なるものです.
また,手続き型言語に比べてオブジェクト指向言語の利点としては,再利用性の向上が上げられます.
例えば,オブジェクト指向で設計されたあるフレームワークやライブラリを,
一部修正・機能追加して利用したいとします.
この場合,既存のクラスを継承して,自分の追加・変更したい機能だけを書くことで
利用することができ,既存のクラスに自分の修正の影響を与えません.
(手続き型言語では,既存のコードを書き換えるか,コピーをそのまま持ってきて書き換えるしか
無いでしょう)
あくまでオブジェクト指向設計がうまく行われていた場合の話なのですが,
何でもオブジェクト指向設計でプログラムを組めば良いというものでもありません.
ただ,うまくオブジェクト指向設計されていれば,再利用性,保守性と言う点では
有利ではあると思います.
少しスッキリしました。
オブジェクト指向を取り入れるだけでは何もかわらないということですね。
何でもそうですが、使いようが大事ですね。
大規模な開発にはもちろん、適切なシステム細分化と抽象化は大事ですね。