(function(w,d,s,l,i){w[l]=w[l]|||[];w[l].push({'gtm.start': new Date().getTime(),event:'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'); Lietošanas gadījumu modeļa pielietošana ar Rails - The Codest
The Codest
  • Par mums
  • Pakalpojumi
    • Programmatūras izstrāde
      • Frontend izveide
      • Backend izstrāde
    • Staff Augmentation
      • Frontend izstrādātāji
      • Backend izstrādātāji
      • Datu inženieri
      • Mākoņa inženieri
      • QA inženieri
      • Citi
    • Tā Konsultatīvais dienests
      • Audits un konsultācijas
  • Nozares
    • Fintech un banku darbība
    • E-commerce
    • Adtech
    • Healthtech
    • Ražošana
    • Loģistika
    • Automobiļu nozare
    • IOT
  • Vērtība par
    • CEO
    • CTO
    • Piegādes vadītājs
  • Mūsu komanda
  • Case Studies
  • Zināt, kā
    • Blogs
    • Tikšanās
    • Tiešsaistes semināri
    • Resursi
Karjera Sazinieties ar mums
  • Par mums
  • Pakalpojumi
    • Programmatūras izstrāde
      • Frontend izveide
      • Backend izstrāde
    • Staff Augmentation
      • Frontend izstrādātāji
      • Backend izstrādātāji
      • Datu inženieri
      • Mākoņa inženieri
      • QA inženieri
      • Citi
    • Tā Konsultatīvais dienests
      • Audits un konsultācijas
  • Vērtība par
    • CEO
    • CTO
    • Piegādes vadītājs
  • Mūsu komanda
  • Case Studies
  • Zināt, kā
    • Blogs
    • Tikšanās
    • Tiešsaistes semināri
    • Resursi
Karjera Sazinieties ar mums
Atpakaļ bultiņa ATGRIEZTIES ATPAKAĻ
2022-04-05
Programmatūras izstrāde

Lietošanas gadījumu modeļa izmantošana ar Rails

Nicolas Nisoria

Bieži sastopama problēma, strādājot ar Rails, ir izlemt, kur izvietot mūsu funkciju loģiku.

Loģika bieži vien tiek ievietota kontrolieros, modeļos vai, ja mums paveicas, pakalpojuma objektā. Tātad, ja mums ir pakalpojumu objekti, tad kāpēc mums ir vajadzīgi lietojuma gadījumi?

Sekojiet man šajā rakstā, lai atklātu priekšrocības šo modeli.

Lietošanas gadījums

Definīcija

Lietošanas gadījums ir darbību vai notikumu soļu saraksts, kas parasti nosaka mijiedarbību starp lomu un sistēmu, lai sasniegtu mērķi.

Ir vērts pieminēt, ka šis modelis tiek izmantots dažādos veidos un tam ir dažādi nosaukumi. Mēs to varam atrast kā Interaktori, Operatori vai Komandas, bet Rubīns kopiena mēs pieturēties ar Lietošanas gadījums. Katra implementācija ir atšķirīga, bet tai ir viens un tas pats mērķis - kalpot sistēmas lietotāja lietojumam.

Pat ja mūsu projekts mēs nenosakām prasības, izmantojot Lietošanas gadījumss un UML šis modelis joprojām ir noderīgs, lai praktiski strukturētu biznesa loģiku.

Noteikumi

Mūsu Lietošanas gadījumi jābūt:

  • Agnostisks ietvarstruktūras lietojums
  • Datu bāzu agnosticitāte
  • Atbildīgs tikai par vienu lietu (definēt soļus, lai sasniegtu lietotāja mērķi).

Ieguvumi

  • Lasāmība: Viegli lasāms un saprotams, jo soļi ir skaidri definēti.
  • Atdalīšana: Pārcelt loģiku no kontrolieriem un modeļiem un izveidot jaunu abstrakcijas līmeni.
  • Redzamība: Kodbāze atklāj sistēmā pieejamās funkcijas.

Praksē

Pieņemsim piemēru ar lietotāju, kas vēlas kaut ko iegādāties mūsu sistēmā.

modulis UseCases
  modulis Pircējs
    klase Pirkums
      def initialize(pircējs:, grozs:)
        @buyer = buyer
        @cart = cart
      end
      def call
        return ja vien check_stock
        return ja vien create_purchase
paziņot end end
privāts
      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

Kā redzat šajā kods Piemēram, mēs izveidojām jaunu Lietošanas gadījums sauc par pirkumu. Mēs definējām tikai vienu publisko metodi zvaniet. Izsaukuma metodes iekšpusē ir atrodami diezgan pamata soļi, lai veiktu pirkumu, un visi soļi ir definēti kā privātas metodes. Katrā solī tiek izsaukts pakalpojuma objekts, tādējādi mūsu Lietošanas gadījums ir definēti tikai pirkuma veikšanas soļi, nevis pati loģika. Tas dod mums skaidru priekšstatu par to, ko var izdarīt mūsu sistēmā (veikt pirkumu), un soļus, kā to panākt.

Tagad mēs esam gatavi izsaukt mūsu pirmo Lietošanas gadījums no kontroliera.

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

    ...
  beigas

  ...
beigas

No šāda viedokļa Lietošanas gadījums izskatās līdzīgi kā pakalpojuma objekts, taču mērķis ir atšķirīgs. Pakalpojuma objekts veic zema līmeņa uzdevumu un mijiedarbojas ar dažādām sistēmas daļām, piemēram, datu bāzi, bet pakalpojuma objekts Lietošanas gadījums rada jaunu augsta līmeņa abstrakciju un definē loģiskos soļus.

Uzlabojumi

Mūsu pirmais Lietošanas gadījums darbojas, bet varētu būt labāks. Kā mēs to varētu uzlabot? Izmantosim sausais dārgakmeņi. Šajā gadījumā mēs izmantosim sausais darījums.

Vispirms definēsim mūsu bāzes klasi.

UseCase klase
  include Dry::Transaction

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

Tas palīdzēs mums nodot atribūtus UseCase transakcijai un izmantot tos. Tad mēs esam gatavi no jauna definēt mūsu iepirkuma lietojuma gadījumu.

modulis UseCases
  modulis Pircējs
    klase Pirkums
      def initialize(pircējs:, grozs:)
        @buyer = buyer
        @cart = cart
      end

      def call
        return ja vien check_stock
        return unless create_purchase
        paziņot
      end

      privāts

      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

Ar jaunajām izmaiņām mēs varam skaidri redzēt, kā ir definēti mūsu soļi, un varam pārvaldīt katra soļa rezultātu, izmantojot Success() un Failure().

Mēs esam gatavi izsaukt mūsu jauno lietojuma gadījumu kontrolierī un sagatavot atbildi atkarībā no galarezultāta.

klase 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

    ...
  beigas

  ...
beigas

Šo piemēru varētu vēl vairāk uzlabot ar validāciju, taču ar to pietiek, lai parādītu šī modeļa iespējas.

Secinājumi

Būsim godīgi, ka Lietošanas gadījuma modelis ir diezgan vienkāršs un ļoti līdzinās pakalpojuma objektam, taču šis abstrakcijas līmenis var būtiski mainīt jūsu lietojumprogrammu.

Iedomājieties jaunu izstrādātājs pievienojoties projektam un atverot mapi use_cases, pirmais iespaids būs tāds, ka viņš redzēs visu sistēmā pieejamo funkciju sarakstu, un, atverot vienu lietojuma gadījumu, viņš redzēs visas nepieciešamās darbības, kas saistītas ar šo funkciju, neiedziļinoties loģikā. Šī kārtības un kontroles sajūta ir galvenā šī modeļa priekšrocība.

Ņemiet to savā darbarīku kastē, un varbūt nākotnē jūs to labi izmantosiet.

Saistītie raksti

Programmatūras izstrāde

Ruby on Rails modulēšana ar Packwerk Episode I

Cilvēkiem ir grūti saskatīt problēmas kopainu, neveltot tam daudz laika un pūļu. Īpaši tas notiek, strādājot ar lielām un sarežģītām lietojumprogrammām.....

Nicolas Nisoria
Programmatūras izstrāde

Ruby on Rails modulācija ar Packwerk Episode II

Otrajā mūsu Ruby on Rails modulēšanas ar Packwerk epizodē mēs aplūkosim lietojumprogrammas kā paketes koncepciju.

Nicolas Nisoria
Programmatūras izstrāde

Sliedes un citi transporta līdzekļi

Rails ir ar Rack saderīga sistēma, kas paredzēta ātrai lietojumprogrammu izstrādei. Diemžēl "viss no kastes" pieeja un aklā Rails-way uzvedība bieži vien izraisa lietojumprogrammas koda kvalitātes zudumu,...

The Codest
Krzysztof Buszewicz Vecākais Software Engineer

Abonējiet mūsu zināšanu bāzi un saņemiet jaunāko informāciju par IT nozares pieredzi.

    Par mums

    The Codest - starptautisks programmatūras izstrādes uzņēmums ar tehnoloģiju centriem Polijā.

    Apvienotā Karaliste - Galvenā mītne

    • 303B birojs, 182-184 High Street North E6 2JA
      Londona, Anglija

    Polija - Vietējie tehnoloģiju centri

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Krakova
    • Brain Embassy, Konstruktorska
      11, 02-673 Varšava, Polija

    The Codest

    • Sākums
    • Par mums
    • Pakalpojumi
    • Case Studies
    • Zināt, kā
    • Karjera
    • Vārdnīca

    Pakalpojumi

    • Tā Konsultatīvais dienests
    • Programmatūras izstrāde
    • Backend izstrāde
    • Frontend izveide
    • Staff Augmentation
    • Backend izstrādātāji
    • Mākoņa inženieri
    • Datu inženieri
    • Citi
    • QA inženieri

    Resursi

    • Fakti un mīti par sadarbību ar ārējo programmatūras izstrādes partneri
    • No ASV uz Eiropu: Kāpēc Amerikas jaunuzņēmumi nolemj pārcelties uz Eiropu?
    • Tehnoloģiju ārzonas attīstības centru salīdzinājums: Tech Offshore Eiropa (Polija), ASEAN (Filipīnas), Eirāzija (Turcija)
    • Kādi ir galvenie CTO un CIO izaicinājumi?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Autortiesības © 2026 The Codest. Visas tiesības aizsargātas.

    lvLatvian
    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 lt_LTLithuanian is_ISIcelandic lvLatvian