ASP.NET MVCでできることとRuby on Railsでできないことは何ですか?[閉まっている]


37

ASP.NET MVCとRailsの使用領域は似ており、同じアーキテクチャを中心に構築されています。どちらのフレームワークも比較的新しく、オープンソースです。

それで、私が知りたいRailsプログラマーとして、ASP.NET MVCができることとRuby on Railsができないこと、そしてその逆のことを知りたいですか?


いい質問ですね。私はMVC開発者であり、これに対する答えを知りたいと思っています。
StuperUser

14
これらのタイプの質問は自由であり、ウェブIMHOをトローリングすることでより適切に回答されます。BMW 335は、現代のソナタができないことを何ができるのでしょうか?両方とも4つの試行とハンドルがあり、同じ消費フレームワーク上に構築されています。燃料。これらの質問は...私はこれがプログラマーであるため、多くの人が反対するだろうと確信している....もっと直接的な質問を容易にすることができる特定のトピックについて理解した上で研究が不足しているため、表面
アーロンMcIver

1
@Aaron-この質問への回答を追加するのに苦労しましたが、原則的にはあなたに同意します。あなたのアナログを借りるには、ある車を別の車と比較していることを明確にしたいと思います。
アダムクロスランド

10
私はそれが有効な質問だと個人的に思った。多くの人は物語の片側だけを知っているので、そのような質問はそれほど簡単に打ち倒されるべきではなく、反対側のアイデアを得るのにも役立ちます。ところで、StackExchangeに関する質問をすることは、私の本の研究としての資格を与えます。
ウマルファルークカワジャ

3
私はこのような質問を頻繁に行い、それらを撃haveするので、私はここでOPに対するいくつかのサポートを示したいと思います。コーディング時に行われる決定は、ほとんど常に主観的です。私の権利はあなたの間違いかもしれませんが、どちらも同等の(主観的な)メリットの実用的なソリューションを開発できます。この場合、OPは2つの相反する技術の相対的なメリットについて意見を求めています。どちらかを選択する実用的なプロセスを経験した人の心の中を除いて、その情報はどこにもありません。したがって、これは正当な質問です。
イアン

回答:


31

RailsとASP.NET MVCの両方を使用して実際のアプリケーションを開発しましたが、この答えには重大な注意事項があります:バージョン2以前のRailsで学習し開発したため、私のRailsの知識。

ことで、私はないと思います、と述べた何もなく一方他で行うことができます。Webアプリケーションの一連の要件を考えると、RailsまたはASP.NET MVCのいずれかを使用して、おそらく同じくらい効率的にそのアプリをビルドできるはずです。

ASP.NET MVCでは、主にC#/。NETの側面のために、いくつかのすてきなものがあります(私の知る限り)。たとえば、送信されたフォームを含むページがある場合、何をすべきかを決定するためにGETまたはPOSTを処理しているかどうかを確認するアクションがあります。

def edit
  @item = Item.find(params[:id])

  if request.post? 
    @item.update_attributes(params[:item])
    redirect_to :action => 'edit', :id => @item.id 
  end
end

これは簡単な例ですが、if request.post?パターンはRailsで非常に一般的なものです。自明ではない場合、Actionコードは大きくて乱雑になる可能性があり、多くの場合、きれいに別のメソッドにリファクタリングできることを望みます。ASP.NET MVCでは、次のことができます。

public ActionResult Edit() {
  // Render my page that has the Edit form
  ...
}

[HttpPost]
public ActionResult Edit(Foothing foo) {
  // Save my Foothing data
  ...
}

GETリクエストとPOSTリクエストの処理をきれいに分離できると思います。あなたのマイレージは異なる場合があります。

ASP.NET MVCが行うもう1つの優れた機能(これも私の意見です)は、フォームPOSTSの処理にも関連しています。Railsでは、paramsすべてのフォーム変数のハッシュをクエリする必要があります。「status」、「gonkulated」、「invert」、「disposition」というフィールドを持つフォームがあるとしましょう:

def edit
  @item = Item.find(params[:id])

  if params[:status] == "new"
    ...
  else
    ...
  end

  if params[:gonkulated] == "true"
    ...
  else
    ...
  end

  if params[:invert] == "true"
    ...
  else
    ...
  end

  # Rest ommited for brevity
end

しかし、ASP.NET MVCでは、すべてのフォーム値をActionメソッドのパラメーターとして取得できます。

[HttpPost]
public ActionResult Edit(int id, string status, bool gonkulated, bool invert, int disposition) {
    ...
}

これらは、ASP.NET MVCまたはRailsについて私が本当に愛していた2つのことです。健全な開発者や有能な開発者が一方のフレームワークをもう一方よりも選択する理由は十分ではありません。


6
アクションパラメータについて:public ActionResult Edit(Foothing foothing)ModelBinderの機能はすっきりしていると思っていたでしょう。
-rmac

10
Railsの例はかなり古くなっています。それらは機能しますが、これを行うより良い方法があります。
ジェイソンw

2
@Jason:これを拡張して、要点を投稿しますか?
ダン

3
request.postに同意しますか?私にとっても珍しいようです(古いバージョンで使用されたためかもしれません)。私はRails 3から始めました。編集メソッドは常に「get」です。投稿として設定することもできますが、Railsは「更新」メソッドを使用してモデルに発生する変更を投稿するRESTfulパターンを使用します。したがって、正しく行われていれば、「編集」メソッドが投稿であったかどうかを確認する必要さえありません。
フィリップクレッグ

3
あなたが賢明な議論を提示するという理由だけであなたを投票します。私はRailsが好きですが、それは完全に主観的であり、あなたはあなたの主張をよく主張します。
スティーブヒル

6

Railsに対するASP.NET MVCの利点の1つは、既存のデータベース上に新しいアプリケーションを構築する必要がある場合です。RailsのActiveRecordはテーブルの構造について非常に考えられています(テーブルには「id」と呼ばれる主キーとして1つの整数列が必要です)、既存のテーブルがActiveRecordの設定に準拠していない場合、ActiveRecordを作成するのは難しいです作業。ただし、ActiveRecordとRailsを使用した新しいdbを使用した新しいアプリの開発は高速です!

ASP.NET MVCにはデフォルトのORMはありません。ニーズに合ったデータアクセス戦略を選択できます。nhibernateのような一部のORMは、レガシーデータベースをサポートできます。guid主キーなどを持つことができます。

DataMapperと呼ばれるRails ActiveRecordの代替がありますが、私は試していません。


9
RubyのActiveRecordでは、特定の規則に従えば多くのコードを削除できますが、必須ではありません。規則に従わない場合は、より明確にする必要があります。
ケビンクライン

1
ASP.NET MVCにはORMのEntity Frameworkがありますが、これまでの経験からすれば、これはかなりすばらしいものです。
クーパー

驚くほど、適切に記述されたSQLの20倍遅いひどく生成されたクエリを実行することを意味する場合はそうです;)... Dapper Contribは素晴らしい&高速を発見したものです
...-niico

2

両方を使用した、その答えは、IMO、アプリケーションがより行う必要がある場合にはASP.NET MVCはRailsのよりも柔軟であるということであるだけで、データベースからの読み取り/書き込み。私の経験では、Railsは非常に些細なCRUDロジックを超えて、アプリケーションにあらゆる種類の複雑さやロジックを導入するたびに、迅速かつ大幅に故障します。ASP.NET MVCは、できることについてより「オープン」であるため、この制限はありません。

典型的な「Web 2.0」CRUDアプリで他のすべてが同等であるため、他にできることは何もありませんが、ワークフロー、異なるデータソース、または別のアプリケーションなどとやり取りする必要があるより複雑なアプリケーションこれ一般的なCRUD ではありません。ASP.NETはより多くのことを実行でき、Railsほど制限的ではありません


9
-1 ASP.NET MVCがより柔軟であると考えられる理由はありません-主要コンポーネント、ルーティング、コントローラー、レンダリングを見ると、それらはすべてレールからはぎ取られており、多くの機能も欠落しています。
スコッツシュルテス

1
asp.net mvcはどのように「よりオープン」ですか?crud scaffoldingの全体をスキップして、モデルとコントローラーをゼロから作成し、「ブレークダウン」なしでネストされた関連付け(1対多、多対1、多対多)を作成できます。そして、JavaScriptの重いフロントエンドを使用することに決めた場合、JSON(またはXML、またはその他の形式)ですべてのモデルデータを簡単にクライアントに送信できます。さらに、実装したい機能を考えることができる場合は、おそらくそのための宝石が既に存在します。重要なRailsアプリを見つけるのは難しくありません。
フィリップクレッグ

2
生のc#/ .netフレームワークにドロップダウンできることは、より柔軟であると考えられますか?
クリスバリー

2
これに非常に遅れましたが、この投稿で私が意図したことは、ASP.NET MVCを使用してC#/。NETにドロップし、フレームワーク全体を活用できるようにすることです。当時のRails(約2.0かと思いますか?覚えていません)は基本的にCRUDを非常に簡単にし、他のすべてを難しくしました。これを書いたときに取り組んでいたプロジェクトはRailsで行われ(私のエラー)、「データベースからの読み取り、ページでの表示」を超えてロジックを実行していた分を壊しました。 1.0この時点でIIRC)代わりにアプリにRailsを選択することでした問題の多くに出くわすことはなかったでしょう。
ウェインモリナ

2

私はRuby on Railsを使用したことがないため、この質問に答える資格はありませんが、ASP.NET MVCで気に入っていることの1つは、タイプセーフです。これが邪魔です。Adam Crosslandとrmacはコメントで簡単に触れましたが、次のようなコントローラーメソッドでは、各パラメーターが厳密に入力されることを指摘したいと思います。これにより、文字列表現を適切に型指定された変数に変換することを心配する必要がないという点で、Editメソッド内のコードが非常に簡潔になります。

[HttpPost]
public ActionResult Edit(int id, string status, bool gonkulated, bool invert, int disposition) {
    ...
}

このタイプセーフが表示されるもう1つの場所は、ViewsおよびPartial Viewであり、Partial ViewのビューをPlain Old C#オブジェクトに関連付けることができます。これは、そのビューまたはパーシャルビューのモデルとして機能します。これにより、特に他のビューを含むビューの階層を構築する場合に、作業が非常に簡単になります。

Infinity.ViewModels.Siteがという名前のクラスを含む名前空間である場合ContactViewModel、Razorビューの場合は、ビューの上部に次のような行を配置することでそれを行います。

@model Infinity.ViewModels.Site.ContactViewModel

ASPXビューの場合は、次の方法でビューを宣言することでそれを行います。

<%@ Page Language="C#" ="~/Views/Shared/Site.master" ="System.Web.Mvc.ViewPage<Infinity.ViewModels.Site.ContactViewModel>" %>

Controllerアクションメソッドでモデルオブジェクトの実際のインスタンスをビューに関連付けてから、ビューのModelプロパティによってビュー内のモデルオブジェクトのインスタンスにアクセスします。

私にとって、この強い型付けは超クールです。ASP.NET MVCを作成したチームは、3つのモデル、ビュー、コントローラーの各領域を厳密に型指定するために多大な労力を費やしました。

Ruby-on-Railsにこれがあるかどうかはわかりませんが、そうすることを望みます。


Ruby言語も強く型付けされています(アヒル型もあります)。また、Railsはアクティブレコードを使用して、モデルをビューに自動的に関連付けます。コントローラで宣言する必要はありません。ビューのネストされた階層を作成する場合は、ビューに渡すモデルを表すインスタンス変数をコントローラーに作成します。はい、彼らは両方同じことをすることができます。
フィリップクレッグ

1

それらは非常によく似ており、ほとんどすべてが「同じことをする」ことができます。あるものはあるものでは簡単で、あるものは他のものよりも困難です。

元のリリースではASP.NET MVCを使用しましたが、これは間違いなくRailsクローンからactiverecordを引いたものです。そのため、Railsにはほぼ確実にはるかに大きな機能セットと、はるかに大きなプラグイン/ gemエコシステムがあります。


2
確かに-しかし、Railsも約8年前から存在しているため、順調なスタートを切っています。私はRailsからasp.netに来ており、MVC 3は実際とてもいいです。Entity FrameworkとNuGetパッケージマネージャーは、これまで非常に印象的です。
フィリップクレッグ

1

私の限られた経験では、ASP.NET MVCの主な利点は、コンパイルされた言語であることです。これにより、コンパイル時にすでにプログラミングのバグを検出できます。Rubyは、ユニットテスト中に検出することに依存します。

また、コンパイルされているという事実により、1つの場所でプロパティの名前を変更するなど、高度なリファクタリングツールを使用でき、プロパティへのすべての参照が変更されます。これは少なくとも、多くのRails開発者が使用するTextMateでは実行できません。

一方、Ruby on Railsの主な利点は、インタプリタ言語であるということです;)Rubyの性質、メモリ内のオブジェクトの変更方法、またはクラスへのモンキーパッチは、非常に洗練されたソリューションにつながります。いくつかの例については、本Eloquent Rubyご覧ください。また、Railsフレームワーク自体の大部分は、この機能に基づいています。

任意のオブジェクトの任意のメソッドをいつでも置換できることも、単体テストの作成に大いに役立ちました。.NETでは、依存性注入とIOCコンテナーは、テスト可能なコードを作成するための実質的な要件です。Rubyでは必要ありません。

編集:

それについて考えた後、おそらくRailsのキラー機能はデータベースの移行です。ASP.NET MVCフレームワーク自体は、データベースサポートを提供しません。.NETフレームワークには、Entity FrameworkやLinq to Sqlなどのデータアクセスコンポーネント/ ORMがいくつかあります。ただし、データベース構造を設計するためのツールはありません。

VSのより高価なバージョンの1つにお金を払うと、データベーススキーマを設計できるData Dudeを入手でき、スキーマをデータベースにデプロイするためのいくつかのツールを使用できます。しかし、私が知る限り、アプリケーションの以前のバージョンからの移行処理のサポートは非​​常に限られています。

データベース移行のサポートがないため、ASP.NET MVCは実際にはMVCフレームワークではなく、単にVCフレームワークであると主張する人もいます。

編集(もう一度):

Visual Studioツールチェーン/ EFの変更により、前回の編集以降、コードベースの移行が導入されました。(ただし、そのパスを下る場合はFluentMigratorもチェックしてください)


2
Entity Framework 5.0 Code Firstは移行をサポートしています
-hofnarwillie

実際、4.1からコードファーストの移行がサポートされています。これは、編集して間もなくリリースされました。
ピート

-1

MicrosoftのMVC 3とEntity Frameworkでの私の大きな問題は、驚くほど悪い設計原則です。

私が遭遇した最初の問題の1つは、別のクラスをプロパティとして使用し、可能な値のドロップダウンリストを作成しようとしたときでした。

私のポイントを説明するために、次のような2つのモデルクラスがあるとします。

public class Color
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Thing
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual Color Color { get; set; }
}

Colorプロパティを作成すれば、実際のORMには十分ですが、EFでは十分ではありません。ThingクラスのColorプロパティに、次のような冗長IDを追加する必要があります。

public class Thing
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ColorID { get; set; }
    public virtual Color Color { get; set; }
}

外部オブジェクト参照の冗長IDフィールドを追加しないと、リンクされたクラスのすべての可能なオプションを含むドロップダウンリストを簡単に作成できません。

これは、あるクラスの内部動作を別のクラスに強く結び付けるため、本当にひどい設計です。ThingはColorIDについて何も知らないはずです。Colorクラスは、IDさえ持っていることを公開せずに、独自の同等性チェックを処理する必要があります。

これは101のベストプラクティスですが、Microsoftはコンピュータサイエンスとオブジェクト指向プログラミングの基本原則をまったく知らないようです。[/ rant]


8
エンティティフレームワークオブジェクトに外部キープロパティは必要ありません。また、EFは完全に独立した製品であり、ASP.NET MVCとは一切統合されていません。ビューモデルを使用して、ユーザーインターフェイスを構築し、ドロップダウンリストまたはその他のコントロールを作成する必要があります。
ルシファーサム

同意する。エンティティフレームワークにはIDキーを一切使用しないでください。ORMはオブジェクトIDを処理する必要があります。しかし、ポイントがとられました。恐ろしいEF ORMについてもっと不満を言っています。この例は、ちなみにMicrosoftから直接提供された簡易バージョンです。ContosoUniversityの例では、まさにそれを実現しています。これは私の言い分になります。MicrosoftはMVCまたはORMの実行方法を知らず、その例が示しています。
マイクベサニー

1
ColorIDプロパティを追加すると、時々非常に役立つ遅延読み込みパターンを実装できます。たとえば、参照されるオブジェクトが非常に大きく、オブジェクトのすべてのプロパティ値が実際に必要ない場合、関連するID部分(ColorID)を見つけるためにすべてを取得するのは処理時間の無駄です。また、Nullable / Non-Nullable外部キーを実装することもできます。つまり、Colorが必ずしも必要でない場合はどうなりますか?NULL可能整数にColorIDを変更int?
hofnarwillie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.