window.pipedriveLeadboosterConfig = { base: leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster on juba olemas') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Kasutusjuhtumite mustri rakendamine Railsiga - The Codest
The Codest
  • Meie kohta
  • Teenused
    • Tarkvaraarendus
      • Frontend arendus
      • Backend arendus
    • Staff Augmentation
      • Frontend arendajad
      • Backend arendajad
      • Andmeinsenerid
      • Pilveinsenerid
      • QA insenerid
      • Muud
    • See nõuandev
      • Audit ja nõustamine
  • Tööstusharud
    • Fintech & pangandus
    • E-commerce
    • Adtech
    • Healthtech
    • Tootmine
    • Logistika
    • Autotööstus
    • IOT
  • Väärtus
    • CEO
    • CTO
    • Tarnejuht
  • Meie meeskond
  • Case Studies
  • Tea kuidas
    • Blogi
    • Kohtumised
    • Veebiseminarid
    • Ressursid
Karjäärivõimalused Võtke ühendust
  • Meie kohta
  • Teenused
    • Tarkvaraarendus
      • Frontend arendus
      • Backend arendus
    • Staff Augmentation
      • Frontend arendajad
      • Backend arendajad
      • Andmeinsenerid
      • Pilveinsenerid
      • QA insenerid
      • Muud
    • See nõuandev
      • Audit ja nõustamine
  • Väärtus
    • CEO
    • CTO
    • Tarnejuht
  • Meie meeskond
  • Case Studies
  • Tea kuidas
    • Blogi
    • Kohtumised
    • Veebiseminarid
    • Ressursid
Karjäärivõimalused Võtke ühendust
Tagasi nool TAGASI
2022-04-05
Tarkvaraarendus

Kasutusjuhtumite mustri rakendamine Railsiga

Nicolas Nisoria

Railsiga töötades on levinud probleemiks otsustada, kuhu paigutada meie funktsioonide loogika.

Loogika paigutatakse sageli kontrolleritesse, mudelitesse või kui meil on õnne, siis teenusobjektidesse. Kui meil on olemas Service Objects, siis milleks meil on vaja Use Cases?

Jälgi mind selles artiklis, et avastada selle mustri eelised.

Kasutusjuhtum

Määratlus

Kasutusjuhtum on tegevuste või sündmuste sammude loetelu, mis tavaliselt määratleb rolli ja süsteemi vahelist suhtlust eesmärgi saavutamiseks.

Väärib märkimist, et seda mustrit rakendatakse mitmel erineval viisil ja sellel on alternatiivseid nimetusi. Me võime seda leida kui Interaktorid, Operaatorid või Käsklused, kuid selles Ruby kogukond, kellega me koos püsime Kasutusjuhtum. Iga rakendamine on erinev, kuid selle eesmärk on sama: süsteemi kasutajakohane kasutamine.

Isegi kui meie projekt me ei määratle nõudeid, kasutades Kasutusjuhtums ja UMLi puhul on see muster endiselt kasulik äriloogika struktureerimiseks praktilisel viisil.

Reeglid

Meie Kasutusjuhtumid peab olema:

  • Raamistik agnostiline
  • Andmebaasi agnostiline
  • Vastutab ainult ühe asja eest (määratleb sammud kasutaja eesmärgi saavutamiseks)

Eelised

  • Loetavus: Lihtne lugeda ja mõista, kuna sammud on selgelt määratletud.
  • Lahutamine: Loogika eemaldamine kontrolleritest ja mudelitest ning uue abstraktsioonitasandi loomine.
  • Nähtavus: Koodibaas paljastab süsteemis olemasolevad funktsioonid.

Praktikasse

Võtame näiteks kasutaja, kes soovib meie süsteemis midagi osta.

moodul UseCases
  moodul Ostja
    klass Ostmine
      def initialize(buyer:, cart:)
        @buyer = ostja
        @cart = cart
      end
      def call
        return unless check_stock
        return unless create_purchase
notify end
private
      attr_reader :buyer, :cart
      def check_stock
        Services::CheckStock.call(cart: cart)
end
      def create_purchase
        Services::CreatePurchase.call(buyer: buyer, cart: cart).call
      end
      def notify

         Services::NotifyBuyer.call(buyer: buyer)
       end
     end
   end
 end

Nagu te võite näha selles kood näiteks lõime uue Kasutusjuhtum nimega Ostmine. Me defineerisime ainult ühe avaliku meetodi helista. Kutsemeetodi sees leiame üsna põhilised sammud ostu sooritamiseks ja kõik sammud on määratletud privaatsete meetoditena. Iga samm kutsub Service Objecti, nii et meie Kasutusjuhtum määratleb ainult ostu sooritamise sammud, mitte aga loogika ise. See annab meile selge pildi sellest, mida meie süsteemis saab teha (ostu sooritada) ja millised on selle saavutamiseks vajalikud sammud.

Nüüd oleme valmis helistama oma esimesele Kasutusjuhtum kontrollerist.

klass Controller
  def purchase
    UseCases::Buyer::Purchase.new(
      buyer: purchase_params[:buyer],
      cart: purchase_params[:cart]
    ).call

    ...
  end

  ...
end

Sellest vaatenurgast vaadatuna on Kasutusjuhtum näeb välja nagu Service Object, kuid selle eesmärk on erinev. Service Object täidab madalatasemelist ülesannet ja suhtleb süsteemi erinevate osadega, nagu andmebaas, samas kui Kasutusjuhtum loob uus kõrgetasemeline abstraktsioon ja määratleb loogilised sammud.

Parandused

Meie esimene Kasutusjuhtum töötab, kuid võiks olla parem. Kuidas saaksime seda parandada? Kasutame ära kuiv kalliskivid. Sel juhul kasutame kuivtoiming.

Kõigepealt defineerime oma baasklassi.

klass UseCase
  include Dry::Transaction

  class << self
    def call(**args)
      new.call(**args)
    end
  end
end

See aitab meil UseCase'i tehingule atribuute üle anda ja neid kasutada. Seejärel oleme valmis oma Purchase Use Case'i uuesti defineerima.

moodul UseCases
  moodul Ostja
    klass Ostmine
      def initialize(buyer:, cart:)
        @buyer = ostja
        @cart = cart
      end

      def call
        return unless check_stock
        return unless create_purchase
        teavitab
      end

      private

      attr_reader :buyer, :cart

      def check_stock
        Services::CheckStock.call(cart: cart)
      end

      def create_purchase
        Services::CreatePurchase.call(buyer: buyer, cart: cart).call
      end

      def notify
        Services::NotifyBuyer.call(buyer: buyer)
      end
    end
   end
 end

Uute muudatustega näeme selgelt, kuidas meie sammud on määratletud ja saame iga sammu tulemust hallata Success() ja Failure() abil.

Oleme valmis kutsuma meie uut kasutusjuhtumit kontrolleris ja valmistama oma vastuse sõltuvalt lõpptulemusest.

klass Controller
  def purchase
    UseCases::Buyer::Purchase.new.call(
      buyer: purchase_params[:buyer],
      cart: purchase_params[:cart]
    ) do |result|
      result.success do
        ...
      end
      result.failure do
        ...
      end
    end

    ...
  end

  ...
end

Seda näidet võiks veelgi parandada valideerimisega, kuid sellest piisab, et näidata selle mustri võimsust.

Järeldused

Olgem siinkohal ausad, et Kasutusjuhtumi muster on üsna lihtne ja näeb välja nagu Service Object, kuid see abstraktsioonitase võib teie rakenduses suuri muutusi tuua.

Kujutage ette, et uus arendaja liitub projektiga ja avab kausta use_cases, esimese muljena näeb ta nimekirja kõigist süsteemis olemasolevatest funktsioonidest ja pärast ühe Use Case'i avamist näeb ta kõiki vajalikke samme selle funktsiooni jaoks, ilma et ta läheks sügavale loogikasse. See korrastatuse ja kontrolli tunne on selle mustri peamine eelis.

Võtke see oma tööriistakasti ja võib-olla saate seda tulevikus hästi kasutada.

Seotud artiklid

Tarkvaraarendus

Ruby on Rails modulariseerimine koos Packwerki I episoodiga

Inimestel on raske näha probleemi suurt pilti, ilma et nad pühendaksid sellele palju aega ja vaeva. See juhtub eriti suurte ja keeruliste rakendustega töötades.....

Nicolas Nisoria
Tarkvaraarendus

Ruby on Rails modulariseerimine Packwerk Episode II abil

Meie Ruby on Rails modulariseerimise teises episoodis koos Packwerkiga vaatleme lähemalt rakenduse kui paketi mõistet.

Nicolas Nisoria
Tarkvaraarendus

Rööpad ja muud transpordivahendid

Rails on Rackiga ühilduv raamistik, mis on keskendunud kiirele rakenduste arendamisele. Kahjuks põhjustavad "kõik karbist välja" lähenemine ja pime Rails-käitumine sageli rakenduskoodi kvaliteedi langust,...

The Codest
Krzysztof Buszewicz Vanem Software Engineer

Tellige meie teadmistebaas ja jääge kursis IT-sektori eksperditeadmistega.

    Meie kohta

    The Codest - rahvusvaheline tarkvaraarendusettevõte, mille tehnoloogiakeskused asuvad Poolas.

    Ühendkuningriik - peakorter

    • Büroo 303B, 182-184 High Street North E6 2JA
      London, Inglismaa

    Poola - kohalikud tehnoloogiakeskused

    • Fabryczna büroopark, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Varssavi, Poola

      The Codest

    • Kodu
    • Meie kohta
    • Teenused
    • Case Studies
    • Tea kuidas
    • Karjäärivõimalused
    • Sõnastik

      Teenused

    • See nõuandev
    • Tarkvaraarendus
    • Backend arendus
    • Frontend arendus
    • Staff Augmentation
    • Backend arendajad
    • Pilveinsenerid
    • Andmeinsenerid
    • Muud
    • QA insenerid

      Ressursid

    • Faktid ja müüdid koostööst välise tarkvaraarenduspartneriga
    • USAst Euroopasse: Miks otsustavad Ameerika idufirmad Euroopasse ümber asuda?
    • Tech Offshore arenduskeskuste võrdlus: Euroopa (Poola), ASEAN (Filipiinid), Euraasia (Türgi).
    • Millised on CTO ja CIOde peamised väljakutsed?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Copyright © 2025 by The Codest. Kõik õigused kaitstud.

    etEstonian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch elGreek etEstonian