Ruby on Rails

Een kritische blik op zeven 'bad practices'

Ruby on Rails is een krachtig full-stack web application framework dat bekend staat om zijn elegante syntax en snelle ontwikkelingsmogelijkheden. In de hoop dat ik, Remco, ze (in ieder geval binnen 10KB) nooit meer tegen ga komen gaf ik een workshop over de 'bad practices' binnen het Rails ecosysteem. Want dat iets in Ruby kan, betekent niet dat je het dus ook zo moet doen...

  • Remco

Geschreven door Remco

Wat is Ruby on Rails?

Ruby on Rails is een full-stack web application framework dat gebouwd is op het MVC-architectuurprincipe. Het framework kenmerkt zich door:

  • Convention over configuration
  • DRY (Don't Repeat Yourself) principe
  • Snelle ontwikkelingsmogelijkheden

Bovendien heeft RoR veel ingebouwde oplossingen voor veelvoorkomende taken zoals:

  • Routing
  • View rendering
  • Formulierverwerking
  • Database schema beheer
  • Background jobs
  • E-mailverwerking

Het framework is bewust 'opinionated' opgezet, wat betekent dat het duidelijke keuzes maakt over hoe bepaalde zaken aangepakt moeten worden.

Ervaringen van ontwikkelaars

Binnen 10KB heb ik een aantal collega's gevraagd naar hun ongezouten mening over de voor- en nadelen van Ruby on Rails. Daar kwamen de volgende dingen naar voren:

Fijn aan RoRails

  • Ruby geeft veel vrijheid
  • Elegante syntaxis (zoals 'unless')
  • Geen compiler
  • Developer happiness staat hoog in het vaandel
  • 'Automagisch' en voorspelbaar
  • Goede schaalbaarheid

Stom aan RoRails

  • Magic autoloading
  • Automatische chaining (method, callback, dependent)
  • Metaprogramming (Define_method)
  • Slechte IDE-integratie
  • Matige concurrency vergeleken met NodeJS
  • Lange testbestanden
  • Geen statische types
  • Een fanatieke community

Wat betreft die IDE-integratie

Er zijn wel wat opties om je development omgeving beter te integreren. Een betaalde variant is RubyMine. Er bestaan ook diverse opties voor VScode/Cursor:

Ik heb deze niet allemaal getests, dus probeer vooral ook zelf en laat het me weten als je nog andere opties hebt.

Door naar de "bad practices"

Dat er zo veel mogelijk is, wil niet zeggen dat je het dan ook maar moet doen. Dit is natuurlijk enorm subjectief; wat voor de een een 'handige tool' is, maakt dat een ander moet huilen. De volgende 7 dingen maken mij in ieder geval aan het huilen:

1. Monkey Patching

Het aanpassen of overschrijven van third party code kan leiden tot onvoorspelbaar gedrag en moeilijk te onderhouden code. Hoewel het mogelijk is, is het vaak beter om een bestaande functionaliteit te respecteren en uit te breiden via de juiste kanalen.

2. Metaprogramming

Het gebruik van define_method en dynamische class creatie kan de code minder leesbaar maken. Vooral Class.new(self) en eval constructies kunnen leiden tot complexe en moeilijk te debuggen code.

3. Concern Mazes

Het overmatig gebruik van concerns kan leiden tot complexe afhankelijkheden en moeilijk te volgen code-paden. Het is belangrijk om concerns met mate te gebruiken en de structuur van de applicatie helder te houden.

4. Validation Overrides

Het omzeilen van model validaties via methoden als .update_all() of .save(validate: false) kan leiden tot inconsistente data. Het is cruciaal om validaties te respecteren (ze beschermen ten slotte je data) en alleen in uitzonderlijke gevallen te omzeilen.

5. Custom Database Types

Het definiëren van custom database types kan leiden tot afhankelijkheid van specifieke database-implementaties. Heb je geen last van, tot je een migratie gaat doen naar een andere database. Trust me...

6. Callback Hell

De uitgebreide callback structuur in Rails ( before_validation , after_save , around_destroy , etc.) kan leiden tot complexe code-paden. Gebruik callbacks met mate en houd de flow van de applicatie helder.

7. &block Passing

Het doorgeven van code blocks als argumenten kan krachtig zijn, maar kan ook leiden tot complexe en moeilijk te testen code. Het is belangrijk om deze techniek met zorg te gebruiken.

Conclusie

Ruby on Rails biedt ontwikkelaars een krachtig en flexibel framework voor webontwikkeling. Echter, om Voltaire te quoten: 'with great power comes great responsibility'. Als je je bewust bent van de mogelijke valkuilen en 'bad practices' binnen het framework (en ze vervolgens vermijdt), kan je duurzamere beter te onderhouden code schrijven.

In de praktijk

Als je nu met deze concepten wilt experimenteren, hier vind je een speciale repo met een aantal opdrachten: workshop-rails-10kb. Veel plezier!