(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': data().getTime(),įvykis:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); Naudojimo atvejų modelio taikymas su "Rails" - The Codest
The Codest
  • Apie mus
  • Paslaugos
    • Programinės įrangos kūrimas
      • Priekinės dalies kūrimas
      • Galinės dalies kūrimas
    • Staff Augmentation
      • Priekinės dalies kūrėjai
      • Atgalinės versijos kūrėjai
      • Duomenų inžinieriai
      • Debesų inžinieriai
      • QA inžinieriai
      • Kita
    • Patariamoji tarnyba
      • Auditas ir konsultacijos
  • Pramonės šakos
    • Fintech ir bankininkystė
    • E-commerce
    • Adtech
    • Sveikatos technologijos
    • Gamyba
    • Logistika
    • Automobiliai
    • IOT
  • Vertė už
    • CEO
    • CTO
    • Pristatymo vadybininkas
  • Mūsų komanda
  • Case Studies
  • Sužinokite, kaip
    • Tinklaraštis
    • Susitikimai
    • Interneto seminarai
    • Ištekliai
Karjera Susisiekite su mumis
  • Apie mus
  • Paslaugos
    • Programinės įrangos kūrimas
      • Priekinės dalies kūrimas
      • Galinės dalies kūrimas
    • Staff Augmentation
      • Priekinės dalies kūrėjai
      • Atgalinės versijos kūrėjai
      • Duomenų inžinieriai
      • Debesų inžinieriai
      • QA inžinieriai
      • Kita
    • Patariamoji tarnyba
      • Auditas ir konsultacijos
  • Vertė už
    • CEO
    • CTO
    • Pristatymo vadybininkas
  • Mūsų komanda
  • Case Studies
  • Sužinokite, kaip
    • Tinklaraštis
    • Susitikimai
    • Interneto seminarai
    • Ištekliai
Karjera Susisiekite su mumis
Atgal rodyklė GRĮŽTI ATGAL
2022-04-05
Programinės įrangos kūrimas

Naudojimo atvejų modelio taikymas su "Rails

Nicolas Nisoria

Dirbant su "Rails" dažniausiai susiduriama su problema, kur dėti funkcijų logiką.

Logika dažnai būna patalpinta valdikliuose, modeliuose arba, jei pasiseka, paslaugos objekte. Taigi, jei turime paslaugų objektus, kam mums reikalingi naudojimo atvejai?

Sekite mane šiame straipsnyje, kad sužinotumėte šio modelio privalumus.

Naudojimo atvejis

Apibrėžimas

Naudojimo atvejis - tai veiksmų ar įvykių etapų sąrašas, kuriame paprastai apibrėžiama vaidmens ir sistemos sąveika siekiant tikslo.

Verta paminėti, kad šis modelis taikomas įvairiais būdais ir turi alternatyvius pavadinimus. Jį galime rasti kaip Sąveikautojai, Operatoriai arba Komandos, bet Ruby bendruomenė, kurios mes laikomės Naudojimo atvejis. Kiekviena realizacija yra skirtinga, tačiau jos tikslas yra tas pats - tarnauti naudotojo naudojimosi sistema atvejui.

Net jei mūsų projektas mes neapibrėžiame reikalavimų naudodami Naudojimo atvejiss ir UML, šis modelis vis dar naudingas norint praktiškai struktūrizuoti verslo logiką.

Taisyklės

Mūsų Naudojimo atvejai turi būti:

  • Nepriklausoma nuo sistemos
  • Duomenų bazių agnostikas
  • Atsakingas tik už vieną dalyką (apibrėžti naudotojo tikslo pasiekimo veiksmus)

Privalumai

  • Įskaitomumas: Lengva skaityti ir suprasti, nes žingsniai aiškiai apibrėžti.
  • Atskyrimas: Perkelkite logiką iš valdiklių ir modelių ir sukurkite naują abstrakcijos lygį.
  • Matomumas: Kodų bazė atskleidžia sistemoje esančias funkcijas.

Į praktiką

Paimkime pavyzdį, kai naudotojas nori ką nors įsigyti mūsų sistemoje.

modulis UseCases
  modulis Pirkėjas
    klasė Pirkimas
      def initialize(buyer:, cart:)
        @buyer = buyer
        @cart = cart
      end
      def call
        return nebent check_stock
        return nebent create_purchase
pranešti end
privatus
      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 pranešti

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

Kaip matote šiame kodas sukūrėme naują Naudojimo atvejis vadinamas pirkimu. Apibrėžėme tik vieną viešąjį metodą skambinkite. Skambučio metodo viduje randame gana paprastus pirkimo atlikimo veiksmus, kurie apibrėžti kaip privatūs metodai. Kiekviename žingsnyje kviečiamas paslaugos objektas, todėl mūsų Naudojimo atvejis apibrėžiami tik pirkimo etapai, o ne pati logika. Tai suteikia mus aiškų vaizdą, ką galima padaryti mūsų sistemoje (atlikti pirkimą), ir žingsnius, kaip tai padaryti.

Dabar esame pasirengę iškviesti pirmąjį Naudojimo atvejis iš valdiklio.

klasė Controller
  def pirkti
    UseCases::Buyer::Purchase.new(
      buyer: purchase_params[:buyer],
      cart: purchase_params[:cart]
    ).call

    ...
  pabaiga

  ...
pabaiga

Šiuo požiūriu Naudojimo atvejis atrodo panašiai kaip paslaugos objektas, tačiau jo paskirtis yra kitokia. Paslaugos objektas atlieka žemo lygio užduotį ir sąveikauja su įvairiomis sistemos dalimis, pvz. Naudojimo atvejis sukuria naują aukšto lygio abstrakciją ir apibrėžia loginius veiksmus.

Patobulinimai

Mūsų pirmasis Naudojimo atvejis veikia, bet galėtų būti geresnis. Kaip galėtume jį patobulinti? Pasinaudokime sausas brangakmeniai. Šiuo atveju naudosime sausasis sandoris.

Pirmiausia apibrėžkime savo bazinę klasę.

klasė UseCase
  įtraukti Dry::Transaction

  klasė << self
    def call(**args)
      new.call(**args)
    pabaiga
  pabaiga
end

Tai padės mums perduoti atributus į "UseCase" sandorį ir juos naudoti. Tada galėsime iš naujo apibrėžti savo Pirkimo naudojimo atvejį.

modulis UseCases
  modulis Pirkėjas
    klasė Pirkimas
      def initialize(buyer:, cart:)
        @buyer = buyer
        @cart = cart
      end

      def call
        return nebent check_stock
        return nebent create_purchase
        pranešti
      end

      privatus

      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 pranešti
        Services::NotifyBuyer.call(buyer: buyer)
      end
    end
   end
 end

Atlikę naujus pakeitimus, galime aiškiai matyti, kaip apibrėžiami mūsų žingsniai, ir galime valdyti kiekvieno žingsnio rezultatus naudodami sėkmės() ir nesėkmės() funkcijas.

Esame pasiruošę iškviesti naująjį naudojimo atvejį valdiklyje ir parengti atsakymą, priklausomai nuo galutinio rezultato.

klasė Controller
  def pirkti
    UseCases::Buyer::Purchase.new.call(
      buyer: purchase_params[:buyer],
      cart: purchase_params[:cart]
    ) do |rezultatas|
      result.success do
        ...
      end
      result.failure do
        ...
      end
    end

    ...
  pabaiga

  ...
pabaiga

Šį pavyzdį būtų galima dar labiau patobulinti naudojant patvirtinimus, tačiau to pakanka, kad būtų parodyta šio modelio galia.

Išvados

Būkime sąžiningi, kad Naudojimo atvejo modelis yra gana paprastas ir labai panašus į paslaugos objektą, tačiau toks abstrakcijos lygis gali labai pakeisti jūsų programą.

Įsivaizduokite naują kūrėjas prisijungęs prie projekto ir atidaręs aplanką use_cases, jis pirmiausia pamatys visų sistemoje esančių funkcijų sąrašą, o atsidaręs vieną naudojimo atvejį pamatys visus būtinus tos funkcijos veiksmus, nesigilindamas į logiką. Šis tvarkos ir kontrolės jausmas yra pagrindinis šio modelio privalumas.

Įsidėkite tai į savo įrankių dėžutę ir galbūt ateityje tuo pasinaudosite.

Susiję straipsniai

Programinės įrangos kūrimas

Ruby on Rails moduliavimas su "Packwerk" I epizodas

Žmonėms sunku pamatyti bendrą problemos vaizdą, neskiriant tam daug laiko ir pastangų. Taip atsitinka ypač dirbant su didelėmis ir sudėtingomis programomis....

Nicolas Nisoria
Programinės įrangos kūrimas

Ruby on Rails moduliavimas su "Packwerk Episode II

Antrajame mūsų Ruby on Rails moduliavimo su "Packwerk" epizode atidžiau apžvelgsime paraiškos kaip paketo koncepciją.

Nicolas Nisoria
Programinės įrangos kūrimas

Bėgiai ir kitos transporto priemonės

"Rails" yra su "Rack" suderinama sistema, skirta greitam programų kūrimui. Deja, dėl požiūrio "viskas iš dėžutės" ir aklo "Rails" elgesio programos kodas dažnai praranda kokybę,...

The Codest
Krzysztof Buszewicz Vyresnysis Software Engineer

Prenumeruokite mūsų žinių bazę ir būkite nuolat informuoti apie IT sektoriaus patirtį.

    Apie mus

    The Codest - tarptautinė programinės įrangos kūrimo bendrovė, turinti technologijų centrus Lenkijoje.

    Jungtinė Karalystė - būstinė

    • 303B biuras, 182-184 High Street North E6 2JA
      Londonas, Anglija

    Lenkija - vietiniai technologijų centrai

    • Fabryczna biurų parkas, Aleja
      Pokoju 18, 31-564 Krokuva
    • Brain Embassy, Konstruktorska
      11, 02-673 Varšuva, Lenkija

    The Codest

    • Pagrindinis
    • Apie mus
    • Paslaugos
    • Case Studies
    • Sužinokite, kaip
    • Karjera
    • Žodynas

    Paslaugos

    • Patariamoji tarnyba
    • Programinės įrangos kūrimas
    • Galinės dalies kūrimas
    • Priekinės dalies kūrimas
    • Staff Augmentation
    • Atgalinės versijos kūrėjai
    • Debesų inžinieriai
    • Duomenų inžinieriai
    • Kita
    • QA inžinieriai

    Ištekliai

    • Faktai ir mitai apie bendradarbiavimą su išoriniu programinės įrangos kūrimo partneriu
    • Iš JAV į Europą: Kodėl Amerikos startuoliai nusprendžia persikelti į Europą?
    • Technikos plėtros centrų užsienyje palyginimas: Tech Offshore Europa (Lenkija), ASEAN (Filipinai), Eurazija (Turkija)
    • Kokie yra svarbiausi CTO ir CIO iššūkiai?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Autorinės teisės © 2026 The Codest. Visos teisės saugomos.

    lt_LTLithuanian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian es_ESSpanish nl_NLDutch etEstonian elGreek pt_PTPortuguese cs_CZCzech lvLatvian is_ISIcelandic lt_LTLithuanian