web-dev-qa-db-ja.com

フレームワークはあまりに多くの抽象化を行いますか?

私は1年弱プログラ​​ミングしていて、システムアプリケーション、Webアプリ、および企業/組織向けのスクリプトを書いた経験があります。しかし、私が実際にやったことがないことの1つは、Djangoのようなフレームワーク、RailsまたはZendでの作業です。

Django=フレームワークを見ると、フレームワークでどれだけ抽象化されているかに少し不満を感じています。DRYの主要な目標と最小限のコード、しかし、さまざまなモジュールへの過度の依存とコア機能の高度な抽象化の一部は、次のように感じられます。

  1. モジュール/フレームワークの絶え間なく変化する性質のため、プログラムの日付が非常に速くなります。

  2. 利用可能なフレームワークとモジュールが豊富で、それらのすべての特異性のため、コードを理解しにくくします。

  3. すべてのドキュメントを読んでいない限り、コードの論理性が低くなります。つまり、リストの内包と条件付きロジックを読んで、プログラムが何をしているかを理解することができますが、任意の文字列と辞書を渡す必要がある関数を見ると、すでに第一人者でない限り、物事は少しわかりづらくなります。特定のモジュール。そして:

  4. フレームワークを切り替えるのが困難で面倒になります。言語間の切り替えはすでに難しい課題ですが、コアとなる機能や哲学を十分に理解していれば、管理することができます。フレームワーク間の切り替えは、暗記の問題のように思われます。これは、いくつかの点で、これらのフレームワークが排除するように設計された非効率性を助長しているようです。

MySQLクエリのような単純なものの上に、50層程度の抽象化を本当に置く必要があるのでしょうか。 PHPのPDOインターフェイスのようなものを使用しないでください。準備されたステートメント/入力テストは処理されますが、普遍的に理解できるSQLクエリはまだ関数の一部です。

それらの抽象化は本当に便利ですか?機能の肥大化はそれらを役に立たなくし、フレームワークを使用せずに書かれた同様のアプリケーションと比較してアプリケーションをより難しくしていませんか?

24
user1427661

フレームワークは確かに扱いにくい場合があります。フレームワークが過度に「意見を述べられている」場合、つまり、ある特定のアプリケーションスタイルを実際に好み、すべてのパーツがこの特定のスタイルのサポートに向けられている場合、問題が簡単に発生する可能性があります。

たとえば、フレームワークがユーザーの認証プロセスを完全に抽象化して、コンポーネントを1つだけ追加し、どこかにログインテンプレートを追加して、できれば、ユーザー認証は無料です。これにより、Cookie、セッションの保存、パスワードのハッシュなどについて心配することなく、何度も繰り返し作業を行う必要がなくなりました。

問題は、フレームワークの認証コードのデフォルトの動作が必要なものではないことに気づいたときに始まります。たぶん、最新の最良のセキュリティ慣行に従っていないかもしれません。おそらく、何らかのアクションをトリガーするためにプロセスにカスタムフックが必要ですが、フレームワークはそれを提供していません。設定されているCookieの詳細を変更する必要があるかもしれませんが、フレームワークはこれをカスタマイズする方法を提供していません。

フレームワークによって提供される抽象化により、最初は数日ではなく数分でサイトに重要な機能を追加できましたが、最終的には、必要なことを実行するためにフレームワークと戦わなければならない場合があります。そうしないと、いずれにしても、ニーズに合わせて機能をゼロから作り直す必要があります。

これは、フレームワークの抽象化が悪いと言っているのではありません。これは常にあなたが心に留めておく必要がある可能性であると言うことです。一部のフレームワークはこれに明示的に対応しており、非常に特定の限られたタイプのアプリのプロトタイプまたはプロダクションフレームワークとしてsomethingを非常にすばやく取得する方法を提供します。他のフレームワークは、使用できるコンポーネントの緩いコレクションのようなものですが、後でそれを変更するための柔軟性を多く提供します。

抽象化を使用するときは、抽象化によって何が抽象化されるかを常に大まかに理解する必要があります。 Cookieと認証システムを理解していない場合、抽象化から始めることはお勧めできません。何をしようとしているのかを理解していて、面倒な独自のコードを書く代わりに、すでにそれを実行しているコードが必要な場合、抽象化は非常に時間の節約になります。不十分に書かれた抽象化は、後でトラブルに巻き込まれる可能性があるため、両刃の剣です。


technical抽象化と"business rule"抽象化も区別する必要があります。より高いレベルの言語でのプログラミングは、おそらく見逃したくない抽象化です(Python、PHP、C#対C対アセンブラー;少ない対CSS)。ニーズを正確に満たします(ワンクリック認証と手動コーディングCookie)。

これは、技術的な抽象概念が「リーク」することがほとんどないためです。つまり、Pythonでアプリケーションを作成するときに、マシンコードをデバッグする必要がほとんどありません。ただし、ビジネスルールの抽象化は同じ技術レベルで機能し、実際には単なる "コードバンドル"です。おそらくwill設定されたCookieまたはある時点で作成されたパスワードハッシュをデバッグする必要があります。つまり、多くのサードパーティコードを調べていく必要があります。

21
deceze

抽象化とコードの再利用を誤解しているようです。

ソフトウェア開発業界全体が抽象化の上に構築されています。それらを使用しない、つまり、フレームワーク、ライブラリ、および一般的に社内で記述されていないコードの使用を回避するという理由だけで、ソフトウェアを作成するために必要なコストが数十万、おそらくそれ以上増えることになります。

ジャンボジェットを最初から作成するのではなく、他の航空機を構築するときに長年にわたって開発されたエンジニアリング知識を使用せずに、ビジネスソフトウェアを最初から作成することはありません。

PHPまたはRubyを最初に使用することでそれを得ることができます。すでに大量の抽象化を持っていますね。最も明白なものは次のとおりです。

  1. オペレーティングシステム、プログラミング言語、およびコンパイラーは、アセンブラーおよびハードウェアを大幅に抽象化します。

  2. Webサーバーは、ソケット、フェイルオーバー、HTTPプロトコルなどの抽象化を提供します。

  3. SQLは、データが永続的なストレージサポートに保存され、より高速なアクセスのためにメモリに保持される方法を抽象化し、ACID、ミラーリングなどを保証します。

オペレーティングシステム、Webサーバー、データベース、高水準プログラミング言語のいずれも使用せずに、常にWebアプリを作成しようとする場合があります。ホイールの再発明、つまりyourプログラミング言語、your Webサーバー、およびyourデータベースの再作成に何年も費やしたことがすぐにわかります品質は実際に使用する製品の品質とはかけ離れています。

フレームワークはそれと変わりません。あなたは彼らがすることをすることができます。同じ機能をやり直すのに時間を浪費するだけですが、それらのフレームワークはそれをよりよく実行し、多くの場合、それらのコードはあなたのものよりもテストされ、文書化されます。

EコマースWebサイトのカートの例を見てみましょう。あなたはあなた自身のものを発明してそれを開発するために数週間を費やすかもしれません、またはあなたはフレームワークの内部の多くの人々によって何年もの間開発されたものを取るかもしれません。彼らのテストは、数年の間にそれらの開発者があなた自身のカートを開発するときにあなたが想像もしない多くのバグを発見してパッチを当てたという事実を除いて、テストされることが期待されます。

ユーザーのケースが多いので、それらはより複雑であると返信できます。たとえば、Webサイトにリベートがなく、カートにこの機能が必要ない場合、彼らはリベートを処理する必要があります。まあ、あなたはこの機能を使用することを強制されていませんし、それがあなたのウェブアプリのパフォーマンスにペナルティを与えるようなものでもありません。

既存のカートを使用するのではなく、独自のカートを開発する方が本当に簡単な場合、非常に基本的なシナリオがあるかもしれません。同様に、アプリに必要なのが数値のリストを格納することだけである場合は、データベースは不要です。単純なテキスト入力で十分です。そのような場合は、アプリを過度に設計しないでください。単純なシナリオでは、単純なソリューションが必要です。

もう1つの要因は、コードの読みやすさです。 eコマースのWebサイトを作成したとします。その後、プロジェクトを離れ、別の開発者がそれを維持する必要があります。

  • フレームワークによって提供されるカートを使用していた場合、同僚は安心します。彼は、信頼性が高く、文書化されたフレームワークに依存する小さなコードを維持する必要があります。さらに良い:この開発者は、このフレームワークでの作業に慣れていて、それに慣れている可能性があります。そうでない場合は、Stack Overflowで質問できます。確かに、誰かがすでにフレームワークを使用しています。

  • 自分のカートを持っている場合、同僚は、どこにでも助けを得ることができずに、おそらく文書化されていないカスタムコードを維持する必要があります。

フレームワークを使用すると、次のコードに依存します。

  • 経験豊富な開発者によって書かれました、

  • しばしばペアレビューされ、

  • ユニットテスト済み、

  • 広範囲に文書化され、

  • 何千人もの開発者によって長年使用され、

  • 多くの場合サポートされているので、バグを報告して実際に修正されたのを確認できます。

  • 起こり得る警告と問題を理解しており、Stack Overflowなどのサイトで支援できる多くの開発者に知られています。

  • 今すぐ無料でご利用いただけます。

29

私は同意します-ほとんどのフレームワークは肥大した独裁者になります。彼らは自由を約束しますが、あなたは奴隷状態になります。ツールのようなフレームワークを見てください。最善のツールは、邪魔にならないツールです。もしPHPの場合、私はCodeigniterフレームワークをチェックすることをお勧めします。これは、慣習と自由の間のエレガントなバランスと素晴らしいコミュニティを持っているからです。eコマースカートの例を使用したポスターに-私はあなたに同意できるといいのですが、多くのeコマースソリューションのコードを見て、いくつか設計したので、あなたの例には敬意を払いません。

3
cartalot

Hmmm LedgerSMBの1つの側面は、フレームワークへのアプローチでした。ただし、この種の抽象化には2つの基本的な問題があります。これらは:

  1. 依存関係の爆発

  2. 間違った抽象化

最初の方法は、実際にホイールを再発明する代替手段よりも優れています。 2つ目は、明確に定義されていない問題のケース、または多くの場合、意図された用途以外のものを使用している人々に起因する可能性があるため、ラベル付けが少し難しいものです。

たとえば、ORMを見てみましょう。私はORMを使用しないようにしています。これは、多くの場合、dbがアプリケーションのオブジェクトモデルに合わせて設計されてしまうことがよくあるためです。これは必ずしもそうではありません。 ORMの使用中に優れたDB設計と優れたアプリを維持できる開発者に出会いましたが、更新可能なビューの背後にあるdbのリレーショナルAPIをカプセル化するなど、ormの誇大宣伝が必要としない多くのことに頼っています。

もちろん、大きな問題は、コードが高度に自動化されているほど、特にコードが不透明であるほど、何が問題なのかを確認することが難しくなることです。これは、@ jhewlettが上記で作成したORMに関するポイントです( https://softwareengineering.stackexchange.com/a/190807/63722 を参照)。

航空機を操縦するためのフレームワークとして、高度なアビオニクスが適しているかもしれません。これらは信頼性のために高度に設計されており、飛行の安全性の向上の要因です。ただし、IEEEスペクトラムの 多くの記事 が指摘しているように、これは、自動化の観点から許容できると考えられる範囲外のエラーからの回復可能性を犠牲にしています。デバッグも同様です。プログラムでSQLコードをデバッグすることは1つです。プログラムが使用するSQLコードを書き込むプログラムの一部をデバッグすることは、非常に異なります。

私たちがLedgerSMBフレームワークを最初から作成したのは、私たちが始めた時点では、私たちが望むことを実行する本当に優れたフレームワークがなかったためです。これは実際に私がかなり満足していることの1つであり、プロジェクトの新しい開発者によると、アプリケーションのカスタマイズが非常に簡単になります。 (実際には、SQLコードの生成を最小限に抑え、代わりに手書きのユーザー定義関数に焦点を当てています。つまり、SQL書き込み部分は非常に薄い接着剤です)。はい、一部のプログラマーが慣れている場所よりも多くの抽象化を提供しています(特に、「ストアードプロシージャのオブジェクトプロパティを引数にマップする」と、時々プッシュバックが発生します)。ただし、問題の原因を簡単に特定できるように、すべてをシンプルかつ一貫性のある状態に保つよう努めています。これはかなりうまくいきます。

結局、「多すぎる」は少し主観的ですが、客観的なレベルでは、それはあなたが何をしているかにも依存します。フレームワークが行うように設計されたものを正確に実行している場合、適切に設計されたフレームワークは、完全な量の抽象化を提供します。少し適合度の低いことをしていると、抽象化が多すぎて漏れやすくなります。

2
Chris Travers

はい、便利です。彼らはあなたが解決する必要がある問題を解決するために仕事をしている他の多くの経験豊富な開発者に利点を提供します、それをテストしたことの追加の利点、多くのバグを修正し、あなたが心配する必要のないトリッキーな問題への解決策を提供しますフレームワークを使用して自分で。

彼らは肥大化することができますか?承知しました。これはすべて、必要なもの、およびフレームワークがテーブルにもたらすものによって異なります。単純なWebアプリを使用している場合、Railsはやり過ぎです。解決策として、Sinatraのようなより単純なものを検討する必要があります。

すべてのフレームワークに学習曲線が確実にあり、節約できる作業が多くなるほど急勾配になります。ただし、フレームワークを習得することで、時間を節約でき、次のプロジェクトでその知識をすべて活用できるようになるので、アプリケーションを最初から書き直す必要がなくなります。

しかし、あなたは言う、私は古いプロジェクトから自分のコードをコピーするだけで、それを新しいプロジェクトの出発点として使用できます!私は何が違うのかを変更し、オブジェクト/関数のいくつかをより一般的なものにし、そのトリッキーなコードを解決するより良い方法を考えます!おめでとうございます。フレームワークを作成しました。これをさらに数千回実行すると、Django、RailsまたはZendのようなものがあります。

2
huntmaster

フレームワークは通常、生産性を向上させます(おそらく少し習得した後で)が、多くの場合、トレードオフが伴います。たとえば、場合によっては、パフォーマンスの低下を犠牲にしてプログラマーの生産性を向上させます。

オブジェクトリレーショナルマッパー(ORM)を検討してください。面倒なマッピングコードの多くを処理するという点で優れています。彼らはあなたのためにあなたのオブジェクトを作成するかもしれません。ただし、SQLを抽象化する場合、パフォーマンスを推論してボトルネックを最適化することははるかに困難です。

大量のデータや複雑なクエリを含まないアプリケーションを構築している場合は、パフォーマンスが問題になることはありません。実際、プログラマーの時間は多くのプロジェクトのボトルネックであり、フレームワーク、ライブラリー、および高水準言語はそれを軽減するのに役立ちます。

1
jhewlett

「あなたはライブラリを使用しますが、フレームワークはあなたを使用する」ことに同意します。それはそれを置くための非常にきちんとした方法です。コードの再利用を開始するとすぐに、フレームワークの構築を開始することに同意しません。通常、コードを再度使用するために簡単なコピーと貼り付けだけを行う必要はないためです。構築中のライブラリ。コードをサイトやアプリに組み込む方法について不思議に思う必要はありません。

私にとって重要なのは、投資に必要な以上のリソースを利用しなければならないということです。あるいは、別の見方をすると、フレームワークのニーズが利用可能な報酬よりも大きくなるとすぐに、すべての利点はなくなります。だから「はい!お願いします!そしてありがとう!'私のhtml/CSS/PHPおよびSQL内で必要に応じて機能し、すぐに機能するアセットを作成するすべての人に。

私が理解できないことの1つは、フレームワークがメンテナンスを容易にするということです。インターワーキングパーツの複雑なメッシュが意図したとおりに機能しない場合は、問題のフレームワークについて知っておくべきすべてのことを理解する必要があります。または、新しい構文を大量に入力する準備をしてください。

1
user2583049

これはフレームワークの Hollywood Principle であると言う人もいます:「私たちに電話しないでください、私たちはあなたに電話します」。対照的に、ライブラリを使用する場合は常に、コードがライブラリを呼び出しますが、その逆は行いません。

ご覧のとおり、重要な点は、誰が制御しているか、つまり制御の流れを制御していることです。誰がどのステートメントをどのステートメントの後に実行するかを決定しますか?

賛否両論があり、私がそのような無限の議論を見るときはいつでも、これは客観的に決定可能な質問ではなく、好みの問題であるに違いないと思いがちです。そうでなければ、それはすでに決定されているでしょう。

私の見解では、フレームワークを使用するかライブラリを使用するかによって、あなたがどのような開発者であるかがわかります。

フレームワークを好む場合は、セキュリティと自由を交換することを好みます。おそらくより実用的であり、他の人たちが適切に機能することを信頼する傾向があります。ライブラリを好む場合は、セキュリティを自由と交換することを好みます。おそらく理想主義者であり、他者のアイデアや主張に疑問を投げかけることになります。

前者か後者の方が良いと判断するのは賢明ではないと思います。

あなたの質問への回答:フレームワークはあまりに多くの抽象化をしていませんか?それはあなたが誰であるか、特に第一原理からどのくらい離れて快適に感じるかによって異なります。

...

さらに具体的には、Djangoのようなフレームワークが気に入らない場合は、「Flask :)」のような「microframeworks」を検索してください。

0
logc