web-dev-qa-db-ja.com

ASP.NET MVCでできることとRuby on Railsできませんか?

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

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

37
Nikita Barsukov

RailsとASP.NET MVCの両方を使用して実際のアプリケーションを開発しましたが、この回答には重要な注意事項が含まれています。以前のバージョン2のRailsで学習および開発したので、私のRails知識で非常に古くなっています。

そうは言っても、私は何かでできるとは思いません片方で実行できますが、もう一方では実行できません。 Webアプリケーションの一連の要件があれば、RailsまたはASP.NET MVCのいずれかを使用して、おそらく同等に効率的にそのアプリケーションを構築できるはずです。

筆者の知る限りでは、主にC#/。NETの側面により、ASP.NET MVCで利用できる2つの優れた機能があります。たとえば、送信されたフォームを含むページがある場合、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で非常に一般的なパターンです。自明ではないケースでは、アクションコードが大きく乱雑になる可能性があり、多くの場合、それを個別のメソッドにきれいにリファクタリングできることを望みます。 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を使用すると、すべてのフォーム値をパラメーターとしてアクションメソッドに取得できます。

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

これらは、ASP.NET MVCまたはRailsで本当に気に入った2つの点です。 これらは、正気または有能な開発者が他のフレームワークよりも1つのフレームワークを選択する理由には不十分です。

31
Adam Crossland

Railsを超えるASP.NET MVCの利点の1つは、既存のデータベースを介して新しいアプリケーションを構築する必要がある場合です。RailsのActiveRecordは、テーブルをどのように構造化する必要があるかについて非常に意見が分かれています(テーブルにはそして 'id'などと呼ばれる主キーとして1つの整数列のみ)したがって、既存のテーブルがActiveRecord設定に準拠していない場合、ActiveRecordを機能させるのは困難です。しかし、ActiveRecordとRailsは速いです!

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

Rails ActiveRecord called DataMapper に代わるものがありますが、まだ試していません。

6
Endy Tjahjono

私はRailsでRuby=)を使用したことがないので、この質問に正確に答える資格はありませんが、ASP.NET MVCについて私が非常に気に入っている点の1つは型の安全性です。 Adam Crosslandとrmacはコメントで簡単に触れましたが、次のようなコントローラーメソッドを使用すると、各パラメーターが強く型付けされます。これにより、Editメソッド内のコードがより明確になります。文字列表現を適切に型指定された変数に変換することについて心配する必要はありません。

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

このタイプセーフが表示されるもう1つの場所は、ビューと部分ビューです。このビューでは、部分ビューのビューを、そのビューまたは部分ビューのモデルとして機能するプレーンオールドC#オブジェクトに関連付けることができます。これにより、特に他のビューを含むビューの階層を構築したい場合に、非常に簡単になります。

Infinity.ViewModels.SiteContactViewModelというクラスを含む名前空間です。Razorビューの場合は、ビューの上部に次のような行を配置します。

@model Infinity.ViewModels.Site.ContactViewModel

aSPXビューの場合は、次のようにビューを宣言することによって行います。

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

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

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

Ruby-on-Railsにこれがあるかどうかはわかりませんが、そうしたいと思います。

2

両方を使用した場合のIMOの答えは、ASP.NET MVCは、Railsアプリケーションがjustread /データベースから書き込みます。私の経験では、Railsは、非常に些細なCRUDロジックを超えて、あらゆる種類の複雑さまたはロジックをアプリケーションに導入する分に、迅速かつ大幅に機能しなくなります。ASP.NETMVCは発生しません。この制限は、何ができるかについてより「オープン」であるためです。

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

2
Wayne Molina

それらは非常に似ており、ほとんどすべて「同じことを行う」ことができますが、いくつかのことは一方の方が簡単で、もう一方の方が難しいです。

私は元のリリースの周りでASP.NET MVCを使用しましたが、それは間違いなくRails cloneマイナスactiverecordでした。したがって、Railsはほぼ間違いなくはるかに大きな機能セットとはるかに大きなプラグイン/ gemエコシステム。

1
scottschulthess

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

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

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

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

編集:

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

VSのより高価なバージョンの1つを支払うと、データベーススキーマを設計し、スキーマをデータベースに展開するためのいくつかのツールを備えた Data Dude を取得できます。しかし、私の知る限りでは、アプリケーションの以前のバージョンからの移行を処理するためのサポートは非​​常に制限されています。

ASP.NET MVCは実際にはMVCフレームワークではなく、単にVCフレームワークです。データベースの移行がサポートされていないためです。

編集(もう一度):

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

1
Pete