Що ASP.NET MVC може зробити, а Ruby on Rails не може? [зачинено]


37

ASP.NET MVC і Rails мають схожу область використання, побудовані навколо однієї архітектури, обидві рамки відносно нові та з відкритим кодом.

Отже, як програміст Rails, я хотів би знати, що ASP.NET MVC може зробити, а Ruby on Rails не може, і навпаки?


Чудове запитання. Я розробник MVC і хочу знати відповідь на це.
StuperUser

14
Ці типи питань є відкритими і на них краще відповідати, розвівши веб-сайт IMHO. Що може BMW 335 зробити, що Hyundai Sonata не може? Вони мають 4 спроби, рульове колесо і побудовані на одній і тій же схемі споживання; пальне. Ці питання виникають через брак досліджень щодо розуміння заданих тем, що може полегшити більш пряме запитання .... Я впевнений, що багато хто не погодиться, оскільки це програмісти ...
Аарон Маківер

1
@Aaron - Незважаючи на те, що я пережив проблеми з додаванням відповіді на це питання, я в принципі погоджуюся з вами, і я сподіваюся, що я дав зрозуміти, що позичаючи ваш аналог, ми порівнюємо одну машину з іншою.
Адам Кросленд

10
Я особисто вважав, що це питання дійсне. Такі питання не слід знімати настільки охоче, оскільки багато з нас знають лише одну сторону історії, і це допомагає скласти уявлення і про іншу сторону. BTW, задаючи питання про StackExchange, у моїй книзі кваліфікується як дослідження.
Umar Farooq Khawaja

3
Я часто задаю такі питання, і їх збивають, тому я хотів би отримати тут підтримку для проведення ОП. Рішення, прийняті при кодуванні, майже завжди є суб'єктивними. Моє право могло бути вашим помилкою, тоді як обидва могли розробити робочі рішення з рівними (суб'єктивними) заслугами. У цьому випадку ОП хоче отримати думки про відносні достоїнства двох протилежних технологій. Ви не знайдете цієї інформації ніде, крім ума тих, хто пройшов практичний процес вибору однієї іншої. Тому це правомірне питання.
Іван

Відповіді:


31

Я розробив реальні програми як з Rails, так і з ASP.NET MVC, але ця відповідь має суттєве застереження: я дізнався і розвинувся з Rails до версії 2, тому цілком можливо, що я сильно застарів зі своїм Рейки знань.

Якщо говорити, я не думаю, що можна зробити щось , а не інше. Враховуючи будь-який набір вимог до веб-програми, ви повинні мати можливість створити цей додаток - можливо, однаково ефективно - за допомогою 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 - це дуже круто (знову ж таки, на мою думку), також пов'язане з обробкою форми POSTS. У Rails я повинен запитувати paramsхеш для всіх моїх змінних форм. Скажімо, у мене є форма з полями "статус", "гонкульований", "інвертувати" та "диспозиція":

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. Вони не є достатньою причиною для будь-якого розумного або грамотного розробника вибрати один фреймворк над іншим.


6
Щодо параметрів дії: я б подумав, що public ActionResult Edit(Foothing foothing), тобто, характеристики ModelBinder були ще акуратнішими.
rmac

10
Приклади рейок досить застарілі. Вони працюють, але є кращі способи зробити це.
Джейсон w

2
@Jason: Ви б хотіли розширити це питання і, можливо, опублікуєте суть ?
Dan

3
Я згоден, що request.post? мені також виглядає незвично (можливо, тому, що він використовувався в старих версіях). Я почав з Rails 3, і метод редагування завжди є "отримати". Я припускаю, що ви можете налаштувати його на посаду, але Rails використовує шаблон RESTful, який використовує метод 'update', щоб зробити публікацію до будь-яких змін, які відбудуться в моделі. Отже, якщо це зроблено правильно, вам навіть не доведеться перевіряти, чи був метод редагування повідомленням.
PhillipKregg

3
Голосування вас просто тому, що ви представляєте розумний аргумент. Я вважаю за краще Рейлс, але це повністю суб'єктивно, і ви добре аргументуєте свою справу.
Стів Хілл

6

Однією з переваг ASP.NET MVC над Rails є те, що вам потрібно створити нову програму над наявною базою даних. Rails 'ActiveRecord дуже впевнений у тому, як слід структурувати таблиці (таблиця повинна мати один і лише один цілий стовпець у якості основного ключа, який називається' id 'тощо), тому якщо ваші існуючі таблиці не відповідають налаштуванням ActiveRecord, складно зробити ActiveRecord робота. Але розробка нового додатка з новим db з ActiveRecord та Rails швидко!

ASP.NET MVC не має ORM за замовчуванням. Ви можете вибрати стратегію доступу до даних, яка відповідає вашим потребам. Деякі ORM, такі як nhibernate, можуть підтримувати застарілі бази даних. Ви можете мати первинний ключ орієнтування тощо.

Є альтернатива Rails ActiveRecord під назвою DataMapper , але я не пробував цього.


9
Ruby's ActiveRecord дозволяє вам усунути багато коду, якщо дотримуватися певних умов, але це не потрібно. Якщо конвенції не дотримуються, ви повинні бути більш чіткими.
Кевін Клайн

1
ASP.NET MVC має Entity Framework для ORM, який до цього часу був досить приголомшливим.
Купер

Якщо чудово ви маєте на увазі виконання погано генерованих запитів у 20 разів повільніше, ніж правильно написані SQL, то так;) ... Dapper Contrib - це те, що я знайшов чудово & швидко ...
niico

2

Використовуючи обидва, відповідь IMO полягає в тому, що ASP.NET MVC є більш гнучким, ніж Rails, якщо вашій програмі потрібно зробити більше, ніж просто читати / писати з бази даних. На моєму досвіді Rails виходить з ладу швидко і сильно в ту хвилину, коли ви впроваджуєте будь-який складність або логіку в додаток, що перевищує дуже тривіальну логіку CRUD. ASP.NET MVC не стикається з цим обмеженням, оскільки він більше "відкритий" щодо того, що можна зробити.

За інших рівних даних у типовому додатку CRUD "Веб 2.0" немає нічого, що можна зробити над іншим, але для більш складного додатка, який потребує робочого процесу, або розрізнених джерел даних, або для взаємодії з іншим додатком, або будь-чим іншим що це не типовий CRUD, ASP.NET може зробити набагато більше і не бути настільки ж обмежувальними Rails.


9
-1 Я не бачу жодної причини, чому ASP.NET MVC вважався б більш гнучким - якщо ви подивитеся на основні компоненти, маршрутизацію, контролери, рендерінг, вони теж просто зривають рейки і позбавлені багатьох функцій.
scottschulthess

1
Як asp.net mvc 'більш відкритий'? Я можу пропустити всю грубу риштувальну річ і змусити свої моделі та контролери з нуля плюс створити вкладені асоціації - один до багатьох, багато до одного, багато до багатьох - без жодного "ламання". І якщо я вирішу використовувати фронтальний сервер javascript, я можу так само легко надіслати всі свої дані моделі клієнту в JSON (або XML або будь-який інший формат). Плюс, якщо ви можете придумати функціонал, який ви хотіли б реалізувати, то, ймовірно, для цього вже є дорогоцінний камінь. Не важко знайти нетривіальні програми Rails.
PhillipKregg

2
Можливо, вважати, що можливість переходу до сировини c # / .net вважається більш гнучким?
Кріс Баррі

2
Дуже пізно з цього питання, але те, що я мав на увазі під цим постом, - це ASP.NET MVC дозволяє перейти до C # /. NET та використовувати весь фреймворк. Рейки в той час (приблизно 2.0 я думаю? Не можу згадати) в основному зробили CRUD дуже легким, а все інше важким; проект, над яким я працював, коли писав це, був зроблений в Rails (моя помилка), і я порушив хвилину, коли ми виконували логіку за межами "читати з бази даних, відображати на сторінці", чи робив я це в C # / ASP.NET MVC ( 1.0 на даний момент IIRC) Я б не стикався з багатьма проблемами, які я робив, вибравши замість Rails для програми.
Уейн Моліна

2

Я ніколи не працював з Ruby на Rails, тому я не є кваліфікованим, щоб відповісти на це питання, але одне, що мені дуже подобається в ASP.NET MVC, - це безпека типу. Це приходить в дорогу. Адам Кросленд і rmac коротко торкнулися цього у своїх коментарях, але хотілося б зазначити, що при такому методі контролера, як наступний, кожен із параметрів буде сильно набраний. Це робить код у методі редагування набагато чистішим, тому що вам не доведеться турбуватися про перетворення рядкових представлень у правильно введені змінні.

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

Інше місце, на яке відображається цей тип безпеки, - це View and Partial View, де ви можете пов'язувати вигляд часткового виду з звичайним старим об'єктом 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 використовує активний запис, щоб автоматично асоціювати свої моделі зі своїми поглядами. Вам не потрібно було б декларувати їх у контролері. Якщо ви хочете створити вкладену ієрархію поглядів, ви створили змінну екземпляра в контролері, що представляє моделі, які ви хотіли б передати у подання. Так що так, вони можуть робити те саме.
PhillipKregg

1

Вони дуже схожі, і всі вони можуть "робити те саме" в основному, просто деякі речі простіші в одних і складніше, ніж інші.

Я використовував ASP.NET MVC навколо оригінального випуску, і це був безумовно клон Rails мінус activerecord. Таким чином, Rails майже напевно має набагато більший набір функцій та значно більшу екосистему плагінів / дорогоцінних каменів.


2
Правда - але Rails також існує вже близько 8 років, тому він має головний старт. Я приїжджаю з Rails на asp.net, і MVC 3 насправді дуже приємний. На сьогодні мене дуже вразили Entity Framework та менеджер пакунків NuGet.
PhillipKregg

1

За моїм обмеженим досвідом, головна перевага ASP.NET MVC полягає в тому, що це мова, що складений. Це дозволяє виявити деякі помилки програмування вже при компіляції, де Рубі доводиться розраховувати на виявлення тоді під час тестування одиниць.

Також той факт, що він складений, дозволяє мати вдосконалені інструменти рефакторингу, наприклад, змінити назву властивості в одному місці, і всі посилання на властивість змінюються. Принаймні цього не можна зробити в TextMate, який використовують багато розробників Rails.

З іншого боку, головна перевага Ruby on Rails полягає в тому, що це інтерпретована мова;) Характер Ruby, як ви можете змінити будь-який об’єкт у пам'яті або мавпа-патч класу, може призвести до деяких дуже елегантних рішень; ознайомтеся з книгою Красномовна Рубі на кілька прикладів. І на цій здатності базується багато самих рамок Rails.

Можливість замінити будь-який метод на будь-який об'єкт у будь-який час також мені дуже допомогла в написанні одиничних тестів. У .NET, Dependency Injection та IOC-контейнери практично є вимогами до створення тестового коду. Це не потрібно в Рубі.

Редагувати:

Після роздумів над цим, ймовірно, вбивчою особливістю Rails є міграція бази даних. Рамка ASP.NET MVC сама по собі не забезпечує жодної підтримки бази даних. Рамка .NET має деякі компоненти доступу до даних / ORM, наприклад, Entity Framework та Linq to Sql. Але у нього немає ніяких інструментів для проектування структури бази даних.

Якщо ви платите за одну з більш дорогих версій VS, ви можете отримати Data Dude , який дозволяє проектувати схему бази даних, і мати деякі інструменти для розгортання схеми в базі даних. Наскільки я можу сказати, підтримка для обробки міграцій із попередніх версій програми дуже обмежена.

Деякі стверджують, що ASP.NET MVC насправді не є рамкою MVC, а лише рамкою VC через відсутність підтримки для міграції баз даних.

Редагувати (знову):

Зміни до ланцюжка інструментів Visual Studio / EF ввели міграцію на основі коду з мого останнього редагування. (але також перевіряйте FluentMigrator, якщо ви йдете по цьому шляху)


2
Код Entity Framework 5.0 вперше підтримує міграцію
hofnarwillie

Власне, перші міграції коду підтримуються з 4.1, який AFAIK був випущений не надто довго після мого редагування.
Піт

-1

Моя основна проблема з Microsoft MVC 3 та Entity Framework - їх приголомшливо погані принципи дизайну.

Однією з найперших проблем, з якою я зіткнувся, було те, коли я використовував інший клас як властивість та намагався створити випадаючий список можливих значень.

Щоб проілюструвати мою думку, скажіть, що у вас є два модельних класи:

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. Ви повинні додати зайвий ідентифікатор для властивості Color у класі Thing так:

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

Якщо ви не додасте поле резервного ідентифікатора для посилання на іноземний об’єкт, ви не можете легко створити спадні списки з усіма можливими параметрами з пов'язаного класу.

Це дійсно жахливий дизайн, оскільки він сильно з’єднує внутрішню роботу одного класу з іншим. Справа не повинна нічого знати про ColorID, клас Color повинен обробляти власні перевірки рівності, не виявляючи, що він навіть має ідентифікатор.

Це найкращі практики 101, але, очевидно, Microsoft абсолютно не знає основних принципів інформатики та об'єктно-орієнтованого програмування. [/ Rant]


8
Вам не потрібна властивість іноземного ключа для об'єктів фреймворку вашої сутності. Також EF - це абсолютно окремий продукт і жодним чином не інтегрований з ASP.NET MVC. Вам слід використовувати моделі перегляду для побудови інтерфейсу користувача та створення будь-яких спадних списків або інших елементів керування.
Люцифер Сем

Я згоден. У вас не повинно бути жодних ідентифікаційних ключів у ваших структурах сутності. ORM повинен обробляти ідентифікацію об'єкта. Але точка взята; Я дуже скаржуся на жахливий EF ORM. Цей приклад - це спрощена версія, яка до речі надходить безпосередньо від Microsoft. Саме так вони роблять це на прикладі ContosoUniversity. Це дійсно говорить на мій погляд. Microsoft не знає, як робити MVC або ORM, і їх приклади це показують.
Майк Бетхані

1
Додавання властивості ColorID дозволяє реалізувати ледачі шаблони завантаження, що дуже корисно часом. Наприклад, якщо посилається об'єкт дуже великий і вам не потрібні всі значення властивостей об'єкта, то це буде марною витратою часу на обробку його лише для того, щоб знайти пов'язану з ним частину ідентифікатора (ColorID) . Це також дозволяє реалізувати зовнішні ключі Nullable / Non-Nullable, тобто що робити, якщо Color не завжди потрібен? Змініть ColorID на Nullable Integerint?
hofnarwillie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.