Cosa può fare ASP.NET MVC e Ruby on Rails no? [chiuso]


37

ASP.NET MVC e Rails hanno un'area d'uso simile, sono costruiti attorno alla stessa architettura, entrambi i framework sono relativamente nuovi e open source.

Quindi, come programmatore di Rails, vorrei sapere cosa possono fare ASP.NET MVC e Ruby on Rails, e viceversa?


Ottima domanda Sono uno sviluppatore MVC e sono desideroso di conoscere la risposta a questo.
StuperUser

14
Questi tipi di domande sono a risposta aperta e hanno una migliore risposta trollando il web IMHO. Cosa può fare una BMW 335 che una Sonata Hyundai non può fare? Entrambi hanno 4 tentativi, un volante e sono costruiti sullo stesso schema di consumo; carburante. Queste domande emergono a causa della mancanza di ricerche sulla comprensione degli argomenti dati che possono facilitare una domanda più diretta .... Sono sicuro che molti non saranno d'accordo poiché si tratta di programmatori ...
Aaron McIver,

1
@Aaron - Anche se ho avuto il problema di aggiungere una risposta a questa domanda, sono d'accordo con te in linea di principio e spero di aver chiarito che per prendere in prestito il tuo analogo, stiamo confrontando un'auto con un'altra.
Adam Crossland,

10
Personalmente ho pensato che fosse una domanda valida. Tali domande non dovrebbero essere risolte così prontamente perché molti di noi conoscono solo un lato della storia e aiuta anche a farsi un'idea dell'altro lato. A proposito, fare una domanda su StackExchange si qualifica come ricerca nel mio libro.
Umar Farooq Khawaja,

3
Faccio spesso domande del genere e le ho abbattute, quindi vorrei mostrare un po 'di supporto qui per l'OP. Le decisioni prese durante la codifica sono quasi sempre soggettive. Il mio diritto potrebbe essere il tuo torto mentre entrambi potrebbero sviluppare soluzioni di lavoro di pari merito (soggettivo). In questo caso, l'OP vuole opinioni sui meriti relativi di due tecnologie opposte. Non troverai tali informazioni da nessuna parte tranne che nelle menti di coloro che hanno attraversato il processo pratico di scegliere l'uno rispetto all'altro. È quindi una domanda legittima.
Ian

Risposte:


31

Ho sviluppato applicazioni reali con Rails e ASP.NET MVC, ma questa risposta ha un avvertimento significativo: ho imparato e sviluppato con Rails pre-versione 2, quindi è del tutto possibile che io sia ampiamente obsoleto con il mio Conoscenza delle rotaie.

Detto questo, non penso che ci sia qualcosa che si possa fare con l'uno ma non con l'altro. Dato qualsiasi set di requisiti per un'applicazione Web, dovresti essere in grado di creare quell'app - probabilmente in modo altrettanto efficiente - con Rails o ASP.NET MVC.

Ci sono un paio di cose pulite che - per quanto ne so - sono disponibili in ASP.NET MVC principalmente a causa di aspetti di C # /. NET. Ad esempio: quando ho una pagina che contiene un modulo che viene inviato, avrei un'azione che controlla se si tratta di un GET o un POST per decidere cosa fare:

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

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

Questo è un esempio banale, ma lo if request.post?schema è estremamente comune in Rails. Per casi non banali, il codice di azione può diventare grande e disordinato e, spesso, vorrei poterlo trasformare in metodi separati in modo pulito. In ASP.NET MVC posso farlo:

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

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

Penso che riuscire a separare in modo chiaro la gestione delle richieste GET e POST sia pulito. Il tuo chilometraggio può variare.

L'altra cosa che ASP.NET MVC fa che è super cool (sempre secondo me) è anche legata alla gestione dei moduli POSTS. In Rails, devo interrogare l' paramshash per tutte le mie variabili di modulo. Diciamo che ho un modulo con i campi 'status', 'gonkulated', 'invert' e '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

Ma ASP.NET MVC mi consente ordinatamente di ottenere tutti i miei valori di modulo come parametri per il mio metodo Action:

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

Queste sono le due cose che ho adorato di ASP.NET MVC o Rails. Non sono sufficienti per uno sviluppatore sano o competente di scegliere un framework rispetto all'altro.


6
Per quanto riguarda i parametri di azione: avrei pensato che public ActionResult Edit(Foothing foothing), ad esempio, le funzionalità di ModelBinder fossero persino più ordinate.
rmac,

10
Gli esempi di binari sono piuttosto obsoleti. Funzionano, ma ci sono modi migliori per farlo.
Jason

2
@Jason: ti andrebbe di approfondire questo e magari pubblicare un riassunto ?
Dan,

3
Sono d'accordo che il request.post? sembra insolito anche per me (forse perché è stato utilizzato nelle versioni precedenti). Ho iniziato con Rails 3 e il metodo di modifica è sempre un 'get'. Suppongo che tu possa configurarlo per essere un post, ma Rails usa un modello RESTful che userebbe un metodo di 'aggiornamento' per fare il post a qualsiasi modifica che si verificherebbe in un modello. Quindi, se fatto correttamente, non dovresti nemmeno controllare se il metodo "modifica" fosse un post.
PhillipKregg,

3
Votandoti semplicemente perché presenti un argomento ragionevole. Preferisco Rails, ma è del tutto soggettivo e tu argomenti bene il tuo caso.
Steve Hill,

6

Un vantaggio di ASP.NET MVC su Rails è se è necessario creare una nuova applicazione su un database esistente. ActiveRecord di Rails è molto stimato su come dovrebbero essere strutturate le tabelle (la tabella deve avere una sola colonna intera come chiave primaria chiamata 'id', ecc.) Quindi se le tue tabelle esistenti non sono conformi alle preferenze di ActiveRecord, è difficile creare ActiveRecord opera. Ma sviluppare una nuova app con un nuovo db con ActiveRecord e Rails è veloce!

ASP.NET MVC non ha ORM predefinito. Puoi scegliere una strategia di accesso ai dati adatta alle tue esigenze. Alcuni ORM come Nhibernate possono supportare database legacy. Puoi avere la chiave primaria guid, ecc.

Esiste un'alternativa a Rails ActiveRecord chiamata DataMapper , ma non l'ho provato.


9
ActiveRecord di Ruby ti consente di eliminare molto codice se segui determinate convenzioni, ma non è necessario. Se le convenzioni non vengono seguite, devi essere più esplicito.
Kevin Cline,

1
ASP.NET MVC ha Entity Framework per ORM, che finora è stato davvero fantastico nella mia esperienza con esso.
Cooper

Se per fantastico intendi eseguire query generate male 20 volte più lentamente di SQL correttamente scritto, allora sì;) ... Dapper Contrib è qualcosa che ho trovato fantastico e veloce ...
Niico

2

Avendo utilizzato sia, la risposta IMO è che ASP.NET MVC è più flessibile di Rails, se le vostre esigenze applicative a fare di più che semplicemente di lettura / scrittura da un database. Nella mia esperienza Rails si rompe rapidamente e pesantemente nel momento in cui introducete qualsiasi tipo di complessità o logica nell'applicazione oltre la logica CRUD molto banale. ASP.NET MVC non incontra questa limitazione poiché è più "aperto" su ciò che puoi fare.

A parità di altre condizioni in una tipica app CRUD "Web 2.0" non c'è nulla che si possa fare rispetto all'altra, ma per un'applicazione più complicata che necessita di un flusso di lavoro o di origini dati diverse o per interagire con un'altra applicazione o altro che non è un tipico CRUD, ASP.NET può fare molto di più e non essere così restrittivo come Rails.


9
-1 Non vedo alcun motivo per cui ASP.NET MVC sarebbe considerato più flessibile - se si guardano i componenti principali, il routing, i controller, il rendering, sono tutti solo strappi di binari e mancano anche molte funzionalità.
scottschulthess

1
In che modo asp.net mvc è "più aperto"? Sono in grado di saltare tutta la roba impalcatura grezza e creare da zero i miei modelli e controller e creare associazioni nidificate - da una a molte, da molte a una, da molte a molte - senza alcuna "rottura". E, se decido di utilizzare un front-end pesante javascript, posso altrettanto facilmente inviare tutti i dati del mio modello al client in JSON (o XML o qualsiasi altro formato). Inoltre, se riesci a pensare a una funzionalità che vorresti implementare, probabilmente c'è già un gioiello per questo. Non è difficile trovare app Rails non banali.
PhillipKregg,

2
Poter passare al framework raw c # / .net potrebbe essere considerato più flessibile?
Chris Barry,

2
Molto tardi, ma ciò che avevo inteso con questo post è ASP.NET MVC che ti consente di passare a C # /. NET e sfruttare l'intero framework. Le rotaie al momento (circa 2.0 penso? Non ricordo) fondamentalmente hanno reso CRUD molto semplice e tutto il resto difficile; il progetto a cui stavo lavorando quando ho scritto questo è stato fatto in Rails (mio errore) e ho interrotto il minuto in cui stavamo facendo la logica oltre a "leggere dal database, visualizzare nella pagina", se lo avessi fatto in C # / ASP.NET MVC ( 1.0 a questo punto IIRC) Non avrei riscontrato molti dei problemi che ho fatto scegliendo Rails per l'app.
Wayne Molina,

2

Non ho mai lavorato con Ruby on Rails, quindi non sono esattamente qualificato per rispondere a questa domanda, ma una cosa che mi piace di ASP.NET MVC è immensamente la sicurezza dei tipi. Questo si presenta. Adam Crossland e rmac lo hanno toccato brevemente nei loro commenti, ma vorrei sottolineare che con un metodo controller come il seguente, ciascuno dei parametri sarà fortemente tipizzato. Ciò rende il codice all'interno del metodo Edit molto più pulito in quanto non devi preoccuparti di convertire le rappresentazioni di stringa in variabili digitate correttamente.

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

L'altro posto che mostra questo tipo di sicurezza è in Viste e Vista parziale in cui è possibile associare una vista di vista parziale con un oggetto C # vecchio normale, che servirà come modello di quella vista o vista parziale. Questo rende la vita molto più semplice, specialmente dove vuoi costruire una gerarchia di viste che contengono altre viste.

Se Infinity.ViewModels.Sitelo spazio dei nomi contiene una classe chiamata ContactViewModel, quindi per le viste Razor, lo fai posizionando una linea come questa nella parte superiore della vista:

@model Infinity.ViewModels.Site.ContactViewModel

e per le viste ASPX, lo fai dichiarando la vista in questo modo:

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

Associare l'istanza effettiva dell'oggetto modello alla vista nel metodo di azione Controller e quindi accedere all'istanza dell'oggetto modello nella vista dalla Modelproprietà della vista.

Questa tipicità, per me, è super cool. Il team che ha creato ASP.NET MVC ha dedicato molti sforzi per rendere fortemente tipizzate ciascuna delle 3 aree di Modello, Vista e Controller.

Non sono sicuro che Ruby-on-Rails abbia questo, ma lo spero.


Anche il linguaggio Ruby è fortemente tipizzato (anche duck tipizzato). E Rails utilizza il record attivo per associare automaticamente i suoi modelli alle sue viste. Non è necessario dichiararli nel controller. Se si desidera creare una gerarchia di viste nidificata, creare una variabile di istanza nel controller che rappresenti i modelli che si desidera vengano passati alla vista. Quindi sì, entrambi possono fare la stessa cosa.
PhillipKregg,

1

Sono molto simili e tutti possono "fare le stesse cose" per lo più, solo alcune cose sono più facili in una e più difficili di altre.

Ho usato ASP.NET MVC intorno alla versione originale ed era sicuramente un clone di Rails meno activerecord. Quindi, Rails ha quasi certamente un set di funzionalità molto più grande e un ecosistema plugin / gemma molto più grande.


2
È vero, ma Rails esiste da circa 8 anni, quindi ha un vantaggio. Vengo da Rails su asp.net e MVC 3 è davvero molto bello. Finora Entity Framework e il gestore di pacchetti NuGet sono stati molto impressionanti per me.
PhillipKregg

1

Nella mia esperienza limitata, il vantaggio principale di ASP.NET MVC è che è un linguaggio compilato. Ciò consente di rilevare alcuni bug di programmazione già durante la compilazione, in cui Ruby deve fare affidamento sul rilevamento durante il test dell'unità.

Inoltre, il fatto che sia compilato rende possibile avere strumenti di refactoring avanzati, ad esempio cambiare il nome di una proprietà in un posto e tutti i riferimenti alla proprietà vengono modificati. Questo almeno non può essere fatto in TextMate, che molti sviluppatori di Rails usano.

D'altra parte, il vantaggio principale di Ruby on Rails è che è un linguaggio interpretato;) La natura di Ruby, come è possibile modificare qualsiasi oggetto in memoria o scimmiottare una classe in una classe, può portare ad alcune soluzioni molto eleganti; controlla il libro Rublo eloquente per alcuni esempi. E gran parte del framework Rails stesso si basa su questa capacità.

La possibilità di sostituire qualsiasi metodo in qualsiasi oggetto in qualsiasi momento mi ha anche aiutato molto nella scrittura di unit test. In .NET, i contenitori Iniezione delle dipendenze e IOC sono praticamente requisiti per la creazione di codice testabile. Questo non è necessario in Ruby.

Modificare:

Dopo averci pensato, probabilmente la caratteristica killer di Rails è la migrazione del database. Il framework ASP.NET MVC non fornisce di per sé alcun supporto per il database. Il framework .NET ha alcuni componenti di accesso ai dati / ORM, ad esempio Entity Framework e Linq to Sql. Ma non ha strumenti per progettare la struttura del database.

Se paghi per una delle versioni più costose di VS, puoi ottenere Data Dude , che ti consente di progettare uno schema di database e avere alcuni strumenti per distribuire lo schema in un database. Ma per quanto ne so, il supporto per la gestione delle migrazioni da versioni precedenti dell'applicazione è molto limitato.

Alcuni sostengono che ASP.NET MVC non è in realtà un framework MVC, semplicemente un framework VC, a causa della mancanza di supporto per la migrazione del database.

Modifica (di nuovo):

Le modifiche alla toolchain / EF di Visual Studio hanno introdotto migrazioni basate su codice dall'ultima modifica. (ma controlla anche FluentMigrator se stai seguendo quel percorso)


2
Il codice Entity Framework 5.0 supporta innanzitutto le migrazioni
hofnarwillie,

In realtà, le prime migrazioni del codice sono supportate dalla 4.1, che è stato rilasciato da AFAIK non troppo tempo dopo la mia modifica.
Pete,

-1

Il mio problema principale con l'MVC 3 di Microsoft e Entity Framework sono i loro principi di progettazione incredibilmente cattivi.

Uno dei primi problemi che ho riscontrato è stato quando ho usato un'altra classe come proprietà e ho cercato di creare un elenco a discesa per i possibili valori.

Per illustrare il mio punto, dire che si hanno due classi modello come questa:

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; }
}

La creazione della proprietà Color sarebbe sufficiente per un ORM reale ma non per EF. Devi aggiungere un ID ridondante per la proprietà Color nella classe Thing in questo modo:

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

Se non si aggiunge il campo ID ridondante per un riferimento a un oggetto estraneo, non è possibile creare facilmente elenchi a discesa con tutte le opzioni possibili dalla classe collegata.

Questo è un design davvero terribile in quanto accoppia fortemente i meccanismi interni di una classe all'altra. La cosa non dovrebbe sapere nulla su ColorID, la classe Color dovrebbe gestire i propri controlli di uguaglianza senza rivelare che ha anche un ID.

Questa è roba di best practice 101 ma apparentemente Microsoft non è del tutto consapevole dei principi di base dell'informatica e della programmazione orientata agli oggetti. [/ Rant]


8
Non è necessaria una proprietà di chiave esterna sugli oggetti del framework dell'entità. Inoltre, EF è un prodotto completamente separato e non è integrato in alcun modo con ASP.NET MVC. Dovresti utilizzare i modelli di visualizzazione per costruire la tua interfaccia utente e creare qualsiasi elenco a discesa o altri controlli.
Lucifero Sam,

Sono d'accordo. Non dovresti avere alcuna chiave ID nel tuo framework di entità. Un ORM dovrebbe gestire l'identità dell'oggetto. Ma punto preso; Mi sto davvero lamentando di più del terribile EF ORM. Quell'esempio è una versione semplificata proveniente direttamente da Microsoft a proposito. È esattamente come lo fanno nell'esempio di ContosoUniversity. Questo parla al mio punto. Microsoft non sa come fare MVC o ORM e i loro esempi lo mostrano.
Mike Bethany,

1
L'aggiunta della proprietà ColorID consente di implementare schemi di caricamento lento che a volte sono molto utili. Ad esempio, se l'oggetto referenziato è molto grande e non hai davvero bisogno di tutti i valori delle proprietà dell'oggetto, sarebbe una perdita di tempo per recuperare tutto solo per trovare la parte ID associata di esso (ColorID) . Consente inoltre di implementare chiavi esterne Nullable / Non Nullable, ovvero se Color non è sempre necessario? Cambia il ColorID in un numero intero nullableint?
hofnarwillie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.