2013-11-25 2 views
3

현재 앱을 레일즈 4로 업그레이드 중입니다.이 앱을 몇 사람 만 설치할 예정이지만 필요성은 다릅니다. 이 업그레이드 버전을 사용하여 일부 모델을 엔진에 적용하기로 결정했습니다. 목표는 상황의 필요에 맞게 앱을 수정하는 시간을 줄이는 것입니다. 핵심 앱이 기본 리소스를 관리하고 엔진이 기능을 추가합니다 (앱은 소규모 조직의 회원 관리). "가이드"를 포함한 많은 설명서를 읽었습니다. 몇 가지 엔진을 테스트하여 앱의 동작을 확인했습니다. 여기에 내 질문에 내가 내 검색으로 대답 할 수 있습니다레일 모범 사례 - 엔진

1 - 이름 지정 규칙 :

어떻게 당신이 당신의 엔진의 이름을합니까? 첫 번째 시도는 함수로 이름을 짓는 것이었지만 첫 번째 모델을 생성 할 때 모델에 함수 이름을 사용할 수 없다는 것을 알았습니다.

나는 같은 생각이었다 Coreappname_functionality

나는 엔진이 지정됩니다 내 회원 활동을 추가 할 exemple에 대한

: member_activities

2 - 내가 많이 읽어 탑재

대 전체 이 주제에 관해서는 많은 사람들이 탑재 가능한 엔진을 사용하는 것 같습니다. 둘 다 시도해 본다. 전체 옵션이 실제로 구현하는 것이 빠르다고 생각한다. (라우팅이없고, 네임 스페이스 격리가 없다는 것을 알고 있어야한다.) 그러나 클래스 충돌의 위험도 이해합니다. 내가이 앱의 코드를 작성하는 유일한 사람이라면 전체 엔진을 사용하는 것이 나쁜 습관이다 (이는 게으름 질문 일 뿐이다). 다른 앱에서 사용할 계획이 없다고하더라도 탑재 가능한 엔진의 다른 장점이 있습니까?

3 - "엔진이있는 경우?"

코어 앱 안에 모든 엔진에 필요한 코드를 넣을 것입니다. 예를 들어 사이드 바 내부에서 마지막 활동의 목록을 표시하려고하지만 활동 엔진이 사용되는 경우에만 표시하려고합니다. 목표는 핵심 애플리케이션 안에 필요한 모든 코드를 넣는 것이지만 엔진의 현재 상태에 따라이 코드를 사용하는 것입니다.

if defined? Activity 
    @activities = Activity.all 
end 

을하고이 같은 전망 뭔가 렌더링 : 내 테스트 기간 동안

내가 사용

<% if defined? Activity %> 
<h3><%= @activities.first.title %></h3> 
<% end %> 

그것은 잘 일하고있어하지만 난 그게 좋은 방법입니다 모르겠어요합니다. 대안이 있습니까?

엔진의 세계로 뛰어 들기 전에 조언이 있습니까? 시도 후에 실수를 게시하는 대신 내 질문을 게시하는 것을 선호합니다! 그것을 읽는 사람을 위해

+0

간단한 질문 : 엔진을 사용하면 여기에서 조정을 줄일 수 있다고 어떻게 생각합니까? – phoet

+0

Hi Phoet, 실제로 앱을 설치하면 모든 기능을 사용할 수 있으며 사용되지 않는 부품을 삭제하는 데 시간을 소비합니다. 나는 엔진이 다른 부품의 유지 보수성을 향상시킬 수 있다고 생각한다. –

답변

2

...

내가 고립 된 엔진이 무엇인지에 대한 오해가 있다고 생각합니다. 사실 약간 혼란 스럽습니다. 어떤 사람들은 고립 된 것과 고립되지 않은 것 중 하나를 선택하는 것이 환경 설정과 같은 것이라고 생각할 수도 있습니다. 하지만 그건 완전히 사실이 아닙니다.

고립 된 엔진은 바로 그 것입니다. 격리 된 엔진입니다. 응용 프로그램의 "모듈"에는 적합하지 않습니다. 그것은 당신의 응용 프로그램의 "하위 응용"과 같습니다. 그 차이는 매우 중요합니다. 응용 프로그램의 모듈은 아마도 모델, API 또는 일부 비즈니스 논리를 공유합니다. 그래도 책임의 캡슐화는 중요하지만 일부 연결이있을 것입니다.예를 들어 거의 모든 모듈이 EventDispatcher 모듈과 같은 것을 사용할 것입니다. 격리 된 엔진은 자체적으로 전체 애플리케이션입니다. 그것은 호스트 응용 프로그램에서 모델을 사용할 수 있지만 다른 고립 된 엔진의 모델을 사용할 수 없습니다 (적어도 해킹이 없으면 '특정 상황'에서 많은 고통이 발생합니다. 일반적으로 나쁜 디자인을 유발하는 나쁜 아이디어입니다).

고립 된 엔진을 사용하여 앱 모듈을 구현하려고하면 모든 모델을 주/호스트 애플리케이션에 저장하여 결국 실제 하위 애플리케이션간에 재사용 할 수 있습니다. 아마 전망과 동일합니다. 어쩌면 자산도 있습니다. 그리고 어떤 비즈니스 로직을 공유해야한다면 아마 메인 어플리케이션에서도 끝날 것입니다. 그래서 그것은 기본적으로 전체 목적을이기는 것입니다. 그래서 모듈에 고립 된 엔진을 사용하지 않아야합니다. 격리 된 엔진은 완전히 캡슐화 된 하위 애플리케이션에 적합합니다. 예를 들어, 전자 상거래 상점을 주 응용 프로그램과 함께 사용하려는 경우 (예 : Spree gem은 정확하게 해당 기능을 수행합니다).

더 많은 엔터프라이즈 예제는 ERP 시스템입니다. 그것은 CRM, Resource Management, etc. (격리 된 엔진)과 같은 하위 애플리케이션을 가질 수 있습니다. 그리고 그 서브 애플리케이션은 그들 자신의 모듈 (고립 된 엔진이 아닌)을 가질 수 있습니다.

내 답변의 완성을 위해서. 고립 된 엔진이란, 을 사용하여 분리되지 않은 것이 생성되는 반면, rails plugin new engine_name --mountable을 사용하여 생성 된 것을 의미합니다.


면책 조항 :

어쩌면 거기에 당신이 (마법 일을 마법 보석의 일종을 구현할 때 아마도) 서로 다른 길을 가고 싶은 경우가 있습니다,하지만 그것을 알아 내기 위해 당신에게 달려 있습니다 . 이 대답을 통해 대부분의 응용 프로그램에 적용될 수 있음을 의미합니다.

+0

몇 년 후에 답을 줄 시간을내어 주셔서 감사합니다! –

+0

엔진의 경우, 나는 당신과 같은 결론을 내리게됩니다. 마지막으로 앱을 빌드하기위한 고립 된 엔진 세트는 좋지 않은 디자인이었습니다. 엔진/보석의 전체 개념은 레일에서 처음 잠수 할 때 이해하기 어렵습니다. 그리고 가능성과 한계를 잘 이해하도록 노력해야합니다. 이제는 복잡한 디자인과 유지 보수성을 피하기 위해 많은주의를 기울여 사용합니다. –

+2

@codingaddicted 정확하게. 그런 '고립 된'모듈이 이론상으로 아주 좋아 보인다는 것은 특히 위험합니다. 그렇습니다 - 그래서 저는 여러분이 이미 이것을 통해 여러분의 길을 만들었다 고 생각했습니다. 그러나 여기에 너무 많은 답변이없는 루비 관련 질문이 있습니다. 이 것은 실제로 좋고 중요한 것입니다. 어쨌든, 그런 질문이 너무 오랫동안 대답없이 머무르면 루비 세계에 좋지 않습니다. – plunntic