programing

레일에서의 OOO 설계:물건을 두는 곳

i4 2023. 5. 31. 15:17
반응형

레일에서의 OOO 설계:물건을 두는 곳

저는 Rails를 정말 즐기고 있고(일반적으로 RESTLESS가 없지만), 루비가 OO인 것을 매우 좋아합니다.그러나 리소스당 컨트롤러를 사용하더라도 대규모 ActiveRecord 하위 클래스와 대규모 컨트롤러를 만드는 경향은 매우 자연스럽습니다.만약 당신이 더 깊은 객체 세계를 만든다면, 당신은 클래스(그리고 모듈)를 어디에 두겠습니까?뷰(도움말 자체), 컨트롤러 및 모델에 대해 묻고 있습니다.

Lib는 괜찮으며 개발 환경에서 다시 로드할 수 있는가지 솔루션을 찾았습니다. 하지만 더 나은 방법이 있는지 알고 싶습니다.저는 단지 수업이 너무 커지는 것이 걱정됩니다.또한, 엔진은 어떤가요? 그리고 그것들은 어떻게 들어맞나요?

Rails는 MVC 측면에서 구조를 제공하기 때문에 제공된 모델, 뷰 및 컨트롤러 컨테이너만 사용하게 되는 것이 당연합니다.초보자(및 일부 중간 프로그래머)의 일반적인 관용구는 앱의 모든 논리를 모델(데이터베이스 클래스), 컨트롤러 또는 보기에 주입하는 것입니다.

어느 순간 누군가가 "뚱뚱한 모델, 마른 컨트롤러" 패러다임을 지적하고 중간 개발자들은 서둘러 컨트롤러의 모든 것을 제거하고 모델에 던지며, 이는 응용프로그램 논리의 새로운 쓰레기통이 되기 시작합니다.

사실 스키니 컨트롤러는 좋은 아이디어입니다. 하지만 모든 것을 모델에 넣는 것이 최선의 계획은 아닙니다.

Ruby에서는 좀 더 모듈화할 수 있는 몇 가지 좋은 옵션이 있습니다.상당히 일반적인 답변은 모듈을 사용하는 것입니다(일반적으로 다음에 표시됨).lib메서드 그룹을 보유한 다음 모듈을 적절한 클래스에 포함합니다.이 기능은 여러 클래스에서 재사용하려는 기능 범주가 있지만 해당 기능이 클래스에 개념적으로 연결되어 있는 경우에 유용합니다.

모듈을 클래스에 포함하면 메소드가 클래스의 인스턴스 메소드가 되므로 메소드가 여러 개의 파일로 잘 구성된 메소드가 포함된 클래스가 됩니다.

이 솔루션은 어떤 경우에는 잘 작동할 수 있습니다. 다른 경우에는 모델, 뷰 또는 컨트롤러가 아닌 코드의 클래스를 사용하는 것을 고려해야 할 수 있습니다.

그것에 대해 생각하는 좋은 방법은 "단일 책임 원칙"인데, 이것은 학급이 하나의 (또는 적은 수의) 것에 책임을 져야 한다는 것입니다.모델은 응용프로그램에서 데이터베이스로 데이터를 유지하는 역할을 합니다.컨트롤러는 요청을 수신하고 실행 가능한 응답을 반환할 책임이 있습니다.

이러한 상자에 깔끔하게 들어맞지 않는 개념(지속성, 요청/응답 관리)이 있는 경우, 해당 아이디어를 어떻게 모델링할지 생각해 보는 것이 좋습니다.다음을 수행하여 비모델 클래스를 앱/클래스 또는 다른 곳에 저장하고 해당 디렉토리를 로드 경로에 추가할 수 있습니다.

config.load_paths << File.join(Rails.root, "app", "classes")

승객 또는 JRuby를 사용하는 경우에는 빠른 부하 경로에 경로를 추가할 수도 있습니다.

config.eager_load_paths << File.join(Rails.root, "app", "classes")

결론적으로 레일즈에서 이 질문을 하게 되면 Ruby Chops를 강화하고 Rails가 기본적으로 제공하는 MVC 클래스가 아닌 모델링 클래스를 시작해야 합니다.

업데이트: 이 답변은 Rails 2.x 이상에 적용됩니다.

업데이트: 문제가 레일 4의 새 기본값으로 사용되는 것으로 확인되었습니다.

이는 모듈 자체의 특성에 따라 달라집니다.저는 주로 컨트롤러/모델 확장을 앱 내의 /corones 폴더에 배치합니다.

# concerns/authentication.rb
module Authentication
  ...
end    

# controllers/application_controller.rb
class ApplicationController
  include Authentication
end



# concerns/configurable.rb
module Configurable
  ...
end    

class Model 
  include Indexable
end 

# controllers/foo_controller.rb
class FooController < ApplicationController
  include Indexable
end

# controllers/bar_controller.rb
class BarController < ApplicationController
  include Indexable
end

/lib는 범용 라이브러리를 위해 제가 선호하는 옵션입니다.저는 항상 lib에 모든 응용 프로그램별 라이브러리를 배치하는 프로젝트 네임스페이스를 가지고 있습니다.

/lib/myapp.rb
module MyApp
  VERSION = ...
end

/lib/myapp/CacheKey.rb
/lib/myapp/somecustomlib.rb

Ruby/Rails 코어 확장은 일반적으로 구성 이니셜라이저에서 수행되므로 라이브러리는 Rails 부스트랩에 한 번만 로드됩니다.

/config/initializer/config.rb
/config/initializer/core_ext/string.rb
/config/initializer/core_ext/array.rb

재사용 가능한 코드 조각의 경우 다른 프로젝트에서 재사용할 수 있도록 (마이크로) 플러그인을 자주 만듭니다.

도우미 파일은 일반적으로 도우미 메소드를 포함하며 오브젝트가 도우미(예: 양식 작성자)가 사용할 때 클래스를 포함하기도 합니다.

이것은 정말로 일반적인 개요입니다.더 많은 맞춤형 제안을 받으려면 특정 예제에 대한 자세한 정보를 제공하십시오.:)

거대한 ActiveRecord 하위 클래스와 거대한 컨트롤러를 만드는 경향은 매우 자연스럽습니다...

걱정스러운 단어는 "http://t." 입니다.;-)

컨트롤러의 규모가 어떻게 커지고 있습니까?이러한 점을 고려해야 합니다. 즉, 컨트롤러가 얇은 것이 이상적입니다.허공에서 주먹구구식 규칙을 선택하면 컨트롤러 메소드(액션)당 코드가 5~6줄 이상 정기적으로 있는 경우 컨트롤러가 너무 뚱뚱할 수 있습니다.도우미 기능이나 필터로 이동할 수 있는 복제가 있습니까?모델에 적용할 수 있는 비즈니스 논리가 있습니까?

어떻게 당신의 모델들이 거대해질 수 있습니까?각 클래스의 책임 수를 줄일 수 있는 방법을 찾아야 합니까?믹스인으로 추출할 수 있는 일반적인 행동이 있습니까?또는 도우미 클래스에 위임할 수 있는 기능 영역이 있습니까?

편집: 조금 더 확장하려고 노력하는 것, 바라건대 너무 심하게 왜곡하지 않기를 바랍니다.

지역: 거주 지역: 거주 지역app/helpers보기를 단순화하는 데 주로 사용됩니다.컨트롤러의 ) 으로 사용 가능한 가능) 모드입니다.module ApplicationHelper에 됩니다.

필터:여러 작업에 동일한 코드 줄이 있다고 가정합니다(종종 사용하여 객체 검색).params[:id]또는 유사).해당 복제는 먼저 별도의 메서드로 추상화한 다음 클래스 정의에 필터를 선언하여 완전히 액션에서 추출할 수 있습니다.before_filter :get_object실행 컨트롤러 레일 가이드의 섹션 6을 참조하십시오. 선언적 프로그래밍을 친구로 사용하십시오.

모델을 리팩터링하는 것은 종교적인 것에 조금 더 가깝습니다.삼촌의 제자들은 예를 들어, 당신이 SOLID의 5계명을 따를 것을 제안할 것입니다.조엘과 제프는 좀 더 "실용적인" 접근법을 추천할 도 있습니다. 비록 그들이 나중에 좀 더 화해한 것처럼 보이기는 했지만요.클래스 내에서 속성의 명확하게 정의된 하위 집합에서 작동하는 하나 이상의 메서드를 찾는 것은 ActiveRecord 파생 모델에서 리팩터링될 수 있는 클래스를 식별하는 한 가지 방법입니다.

레일 모델이 ActiveRecord의 하위 클래스일 필요는 없습니다.베이스, 그건 그렇고요. 것과는 없습니다."라고 말합니다.파일 이름만 지정하면 더욱 좋습니다.app/modelsRails의 관례에 따라 (Rails가 무엇을 찾을지 알아보기 위해 클래스 이름에 #언더스코어를 호출), Rails는 어떤 것도 없이 그것을 찾을 것입니다.require필요한 것은

여기 "얇은 컨트롤러" 철학에서 비롯된 것으로 보이는 지방 모델의 리팩터링에 대한 훌륭한 블로그 게시물이 있습니다.

http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/

기본 메시지는 "지방 모델에서 혼합물을 추출하지 마십시오"이며, 대신 서비스 클래스를 사용하고, 작성자는 이를 위해 7가지 패턴을 제공합니다.

언급URL : https://stackoverflow.com/questions/1068558/oo-design-in-rails-where-to-put-stuff

반응형