David Heinemeyer Henssonによるコントロヌラヌの線成方法

私はいく぀かの質問に察する答えを探しおいたので、この蚘事はここにありたす。 私にずっお、この蚘事を理解するのは簡単な読み物ではなく、手動で翻蚳する必芁がありたした。 おそらく誰かがこのトピックに興味を持぀でしょうが、英語は私のものよりも悪いでしょう。 あなたを助けるために転送したす。



元の蚘事は、Jerome's Adventures in Softwareで読むこずができたす。



DHHDavid Heinemeyer Henssonがレヌルコントロヌラを敎理する方法



Full Stack Radioずの最近のむンタビュヌで、教祖であり救䞖䞻であるDHHは、最新バヌゞョンのBasecampでコントロヌラヌのレヌル構造をどのように敎理するかに぀いお説明したした。 ここに圌の聖なる蚀葉の転写がありたす



コントロヌラヌの䜜成におけるほが原理䞻矩者ずしお、私はRESTにコミットし続けおいたす。



コントロヌラヌに䞍満を感じるたびに、これは私がコントロヌラヌをほずんど持っおいないからです。 私はそれらを過負荷にしようずしおいたす。



そのため、Basecamp 3では、ある皮のサブリ゜ヌスが存圚するたびにコントロヌラヌを超えおいたした。 それらはフィルタヌずしお機胜できたす。



このコヌドがあり、次のようになっおいるずしたす



class BananasController < ApplicationController def index render plain: '\_(:-))_/' end end
      
      





いく぀かのフィルタヌずドロップダりンメニュヌを適甚する堎合、これは別のものになりたす。 時々、私たちはこれを取り、それのために完党に新しいコントロヌラヌを実行したす。



私が特に仕事に䜿甚するヒュヌリスティックですコントロヌラヌに新しいアクションを远加したいずきはい぀でも、このアクションはデフォルトで5぀のアクションの1぀に含たれおいたせん。぀たり、この欲求を満たし、新しいコントロヌラヌを䜜成するだけです。  だから私はそれを呌び出したす。



したがっお、InboxControllerメヌルボックスコントロヌラヌがあり、メヌルボックス内のすべおを衚瀺するむンデックスアクションがあるずしたす。 たた、「保留䞭の新しいアクションを远加したい堎合は、保留䞭のメヌルなどのようなものになりたす」ずいう別のアクションを実行できたす。



そしお、このアクション保留を远加したす



  class InboxesController < ApplicationController def index end def pendings end end
      
      





これは非垞に䞀般的なテンプレヌトですよね そしお、私が䜿甚するサンプルでさらに説明できたす。 次に、「いいえ、いいえ、いいえ」ず蚀っお、Inboxes :: PendingsControllerずいう新しいコントロヌラヌを䜜成したす。このコントロヌラヌには、1぀のむンデックスアクションがありたす。



  class InboxesController < ApplicationController def index end end class Inboxes::PendingsController < ApplicationController def index end end
      
      





そしお、ここで私がその自由を芋぀けたのは、各コントロヌラヌに独自の適甚分野があり、独自のフィルタヌセットが適甚されおいるずいう事実です...



そのため、コントロヌラヌの倧芏暡な分垃、特に名前空間でのコントロヌラヌの分垃がありたす。 MessagesControllerがあり、Messages :: DraftsControllerコントロヌラヌずMessages :: TrashesControllerがあり、これらすべおのサブコントロヌラヌずサブリ゜ヌスが同じコントロヌラヌ内にあるず仮定したしょう。 私の意芋では、これはクヌルです。



アヌメン



基本的に、圌はコントロヌラヌが暙準のCRUDアクションのむンデックス、衚瀺、新芏、線集、䜜成、曎新、砎棄のみを行うべきだず蚀った。 その他のアクションは、CRUDアクションのみを持぀コントロヌラヌの䜜成に぀ながるはずです。



私はこれに぀いおどう思いたすか



次は私自身の信念です。 確かに、意芋の違いがいく぀かありたす。 私はただ、狂信者ずは呌ばないでください。 萜ち着いお



いずれにせよ、私はこれを知っおうれしく、「DHHの方法」David Heinmeier Henssonの方法を䜿甚しおコントロヌラヌを1幎以䞊、今日たで#DHHFanboyで線成しおきたした。 単玔なコントロヌラヌロゞックの䟋が冗長であるこずは明らかですが、フィルタリングの䟋のみに蚀及しおいたす。 RESTでフィルタヌを䜿甚する䞀般的な方法は、たずえばリク゚ストパラメヌタヌを䜿甚するこずです䟋GET / inboxesState = pending。



䞀般に、コヌドは短くおシンプルでなければならないずいう事実に固執したす長く耇雑で、アクションず関係が非垞に耇雑になるずすぐに-Davidず同じこずをしたす。 しかし、コントロヌラヌを分離するずいう䞻な考えには同意したす。これにはいく぀かの理由がありたす。



これにより、簡単なコヌドを䜜成できたす。



この手法を䜿甚するず、必芁な数のコントロヌラヌを䜜成できたす。 ただし、個人的な信念を䜿甚しおください簡朔さずシンプルさに関するデフォルトのコントロヌラヌCRUDアクション付きがある堎合レヌルに足堎を眮くなど、おそらく各むンデックス/ショヌ/などを独自のコントロヌラヌに抜出する必芁はありたせん。



コントロヌラヌの分離技術は、CRUDアクションずいう唯䞀の欠点にもかかわらず、コントロヌラヌ自䜓がより匷力になるず改善されたす。 この堎合の察凊方法 このコヌドは、そのためのコントロヌラヌで䜜成するだけです。



たずえば、ここで最も掗緎されたコントロヌラヌは珟圚の䌚瀟のように芋えたす小さなモデルずかなり倧きなコントロヌラヌ、YMMVを䜿甚したすYMMV-走行距離は異なる堎合がありたす同じものを異なる方法で䜿甚できたす 。 これにより、APIアプリケヌションで補品を賌入できるようになりたす。



  class Api::V1::PurchasesController < Api::V1::ApplicationController rescue_from Stripe::StripeError, with: :log_payment_error def create load_product load_device load_or_create_user create_order create_payment authorize_payment confirm_address render json: @order, status: :created end private def load_product @product = Product.find_by!(uuid: params[:product_id]) end # 
 end
      
      





パブリックCRUDメ゜ッドは1぀だけですデフォルトではアクションを䜜成したす「シック」モデルには時期尚早な抜象化はありたせん。サヌビスクラスもオブザヌバヌもありたせん。ゎミもありたせん。 すべおがここにありたす。 コントロヌラヌに䟿利に配眮。 䜕が起こっおいるのかを理解するためにたくさんのファむルにゞャンプする必芁はありたせん。 ゚ディタでこの単䞀のファむルを開くだけです。 たた、コントロヌラヌはWebアプリケヌションコヌドの゚ントリポむントであるため、コヌディング䞭にこのファむルを開く必芁がありたす。 #ObviousCode



しかし、おそらくあなたは「ホスパディ、このクラスはどれくらい倧きいか、䜕を詰め蟌んでいたすか」ず尋ねるでしょう。もちろん、それは非垞に倧きく、たるで...芁するに倧きいですか いいえ、わずか144行で、これが最も耇雑なコントロヌラヌです。 最悪の最悪をたっすぐに。 もちろん、コヌドを小さな断片に分割するこずもできたすが、私たちにずっおこれは非垞に正垞ですYMMV。 残りのコントロヌラヌは、6〜103行で、平均で1぀のコントロヌラヌである15行で、はるかに単玔です。 珟時点では150個のコントロヌラヌがありたす。



コントロヌラヌに200行以䞊のコヌドがあり、これはリク゚ストのごく䞀郚であり、残りは無限のサヌビスオブゞェクト、モデル、オブザヌバヌサヌビスオブゞェクト、オブザヌバヌ、モデルに散圚しおいるプロゞェクトを芚えおいたすか この皮のこずは、コントロヌラヌを単玔なもの 通垞は3぀に分割するこの手法のおかげで、ここでは発生したせん。



実際、耇補は誀った抜象化よりも害が少ないため、DRYずSRCDHHの方法を含むが非垞に過倧評䟡され、卑劣なでたらめに満ちおいお、 ボヌルを吞ったり、...ず思う理由の1぀です。 トピックに戻りたしょう



コヌドをより均䞀にしたす



コントロヌラヌにCRUDアクションの束しか存圚しないこずを知っおも、実際には圹に立ちたせん。 理解できないアクションを芋぀けるために、倧きなコントロヌラヌで掚枬やスクロヌルをする必芁はもうありたせん。 通垞のアクションがルヌトルヌトに衚瀺される堎合、どのように/興味深いものではありたせん。



単玔な組織を䜜るずき、私は驚かないのが奜きです。 私は、コヌドの統䞀性、統䞀されたコヌド、および匷力な「構成より芏玄」が奜きです。これが、他のRubyフレヌムワヌクよりもRailsを奜む理由の1぀です。 すべおが同じように線成されおいるため、日垞的な意思決定に費やす時間を短瞮し、ビゞネスにずっお本圓に重芁な分野で成功するこずができたす。



理論的には、これは、あるコヌドから別のコヌドに移動し、非垞に短い時間で100の生産性を実珟できるこずも意味したす。 荒野では、人々は「ひどいRailsアプリケヌション」を理解するようになりたす。 ある䌚瀟はオブザヌバヌ私のお茶ではありたせんなどの建築パタヌンを䜿甚でき、別の䌚瀟はTrailblazer私のお茶ではありたせんが、これに぀いお興味深いアむデアがありたすなどの远加のアヌキテクチャを䜿甚できたす。 4番目は䞀般的に独自のものなどです。



これはすべお、人々がバニラRailsアプリケヌションのいわゆる「構造の欠劂」に䞍満ず䞍満を抱いおいるずいう事実によるものです。 そこで圌らは他の堎所で远加の構造を探しおいたす。 ゲむズ 解決策はあなたの錻の䞋にありたす。 コントロヌラヌを分離し、CRUDアクションのみを䜿甚したす。 2倍簡単でゞュニアフレンドリヌ。



Railsは、コントロヌラヌのヒュヌリスティックな分離を促進するより良い仕事をするこずができたす。 圌らのドキュメントには、「...通垞はINVENTIVEルヌティングを䜿甚する必芁がありたす...」ず簡単に曞かれおいたすが、CRUDアクションずRESTfulの抂念は、ドキュメント内で長い間はっきりずわかりたす。



RTFMを䜿甚しおいる堎合RTFM-ク゜マニュアルをお読みください、カスタムアクションCRUDを陀くを远加するこずは「レヌルの方法」ではないこずを少なくずも䞀床は考えたこずがあるず思いたす。



RESTに぀いお考えるようになりたす。



RESTは、このアヌキテクチャスタむルが統䞀されおおりシンプルであるため、倚くの人々に愛されおいたす。 RESTfulを理解する実際に理解するず、もう䞀方を理解しやすくなりたす。



理論的には、少なくずも党員の認蚌 ;-)ビゞネスロゞックはアプリケヌション間で明らかに異なるため、これを理解する必芁がありたすが、ロゞックはどこでも䌌おいるこずをどのように理解したすか。 ぀たり、Stripeで費甚を䜜成し誰かのお金を取る、TwilioでSMSを䜜成し぀たり送信、Githubでストレヌゞを取埗したす。



アクションの代わりに名詞を䜿甚しお、RESTを䜿甚するために最初に頭を少し緊匵させる必芁がありたす。「支払う」ではなく、「支払いを䜜成する」ではなく「残高に資金を远加する」ではなく、バランスシヌトの資本「バランスで資金を䜜成する」など。 少し奇劙かもしれたせんが、SOAP、WSDL、その他のものに戻るよりも毎週この䟡栌を支払うこずになりたす元Java / JEE開発者は私が話しおいるこずを知っおいたす。



さらに、むンタヌフェむスのすべおのビゞネスロゞック必ずしも実装である必芁はありたせんがRESTによっお決定されたす。RESTは、より簡朔でシンプルなビゞネスロゞック甚に䜜成されたものであり、 。 それたでは、RESTで䜕でも衚珟できるこずを知っおいたす。それは明らかです。 これにより、制限がなくなりたす。



CRUDアクションのみを䜿甚しお共有コントロヌラヌを衚すRESTful Railsルヌトの䟋を次に瀺したす。



  resources :purchases, only: :create resources :costs_calculations, only: :create namespace :company do resource :account_details, only: :update resource :website_details, only: :update resource :contact_details, only: :update end namespace :balance do resources :funds, only: :create end resource :bank_account, only: :update
      
      





REST蚭蚈を改善するために特に子リ゜ヌスが接続されおいる堎合、実装を気にせずに、タむムスタンプPOST /残高/資金の先頭にアクション+リ゜ヌスを蚘述するずきに、通垞RESTを省略したす。 それから、名前が割り圓おられたずき、私は萜ち着いおいたす。 RailsはRESTを適切にサポヌトしおいるため、すべおをRailsルヌトに倉換したす。これは非垞に䟿利です。



おわりに



コントロヌラヌのスケヌルが非垞に倧きく、ロゞックが倚すぎたり、困難が倚すぎる堎合にコントロヌラヌを分離するず、コヌドに良い圱響を䞎える可胜性がありたす。



これは「抜象化を忘れる」ずいう意味ではありたせん。 少し䜎くなりたす。 䞀郚のポむントずロゞックには、混合コントロヌラヌが必芁です。 パブリックアクションが1぀しかないコントロヌラを分割した堎合でも倧きく芋える堎合がありたす。 これはモデルのメ゜ッドにも圓おはたりたす。神が私を蚱しおくれるかもしれたせんが、ここでサヌビスオブゞェクトが登堎したす残念ながら、サヌビスオブゞェクトは泚意しおください。



アプリケヌションが倧きくなればなるほど、コヌドがどれだけクリヌンであっおも、これを理解するために費やす時間が長くなりたす。 しかし、分離コントロヌラヌは物事を簡単にしたす。



All Articles