2016-04-05 14 views
1

Reduxが好きです。シンプルで強力です。
しかし、私が実際の言葉でそれを使い始めると、一つの建築的な質問が私を怒らせます。Reduxを使用してビジネスロジックを特定する

ビジネスロジックの場所を特定するにはどうすればいいですか?私はそれを見つけるための2つの可能な場所があるので

  • アクションクリエーター(AC)
  • ストアレデューサー(SR)を

[AC] -> [Action] -> [SR]

以下は3例です。
Ex。 1と2 - 同期シナリオでACとSRでビジネス上の決定を見つける。
Ex。 3 - 非同期シナリオでACで行われたビジネス意思決定。

私のプロジェクトでは、ビジネス上の意思決定がどのようにACとSRの間に非常に急速に広がっているのか気づいたことがあります。ですから、私が何かをデバッグしたいときは、私は自分自身に質問しなければなりません。
アーキテクチャ的には、AC/SRではなく、ドメイン単位でBLを分割したいと考えています。

私のポイント:私は、ホットリロード、タイムトラベルをする純粋な減速の利点を理解する/リドゥが可能な特徴アンドゥながら、私はそのためのロジックの保守性を取引する準備ができていますかわかりません。

まだ、Reduxでは1週間しかありません。
私は何を欠席しましたか?


例1(シンク、決定が減速している):

// action-creators.js 

export function increment() { 
    return { 
    type: 'INCREMENT' 
    } 
} 

export function decrement() { 
    return { 
    type: 'DECREMENT' 
    } 
} 

// counter-reducer.js 

export default function counter(state = 0, action) { 
    switch (action.type) { 
    case 'INCREMENT': 
    return state + 1 // (!) decision of how to '(in|de)crement' is here 
    case 'DECREMENT': 
    return state - 1 
    default: 
    return state 
    } 
} 

例2(同期、意思決定アクション作成者である):

// action-creators.js 

export function increment() { 
    return (dispatch, getState) => { 
    return { 
     type: 'CHANGE_COUNTER', 
     newValue: getState() + 1 // (!) decision of how to '(in|de)crement' is here 
    } 
    }; 
} 

export function decrement() { 
    return (dispatch, getState) => { 
    return { 
     type: 'CHANGE_COUNTER', 
     newValue: getState() - 1 
    } 
    }; 
} 

// counter-reducer.js 

export default function counter(state = 0, action) { 
    switch (action.type) { 
    case 'CHANGE_COUNTER': 
    return action.newValue 
    default: 
    return state 
    } 
} 

例3(非同期、意思決定はアクション作成者にあります):

// action-creators.js 

export function login() { 
    return async (dispatch, getState) => { 
    let isLoggedIn = await api.getLoginState(); 

    if (!isLoggedIn) { // (!) decision of whether to make second api call or not 
     let {user, pass} = getState(); 
     await api.login(user, pass) 
    } 

    dispatch({ 
     type: 'MOVE_TO_DASHBOARD' 
    }) 
    }; 
} 

// some-reducer.js 

export default function someReducer(state = 0, action) { 
    switch (action.type) { 
    case 'MOVE_TO_DASHBOARD': 
    return { 
     ...state, 
     screen: 'dashboard' 
    } 
    default: 
    return state 
    } 
} 

+0

私はこれに1つの答えはないと思いますが、私はディレクトリごとにビジネスロジックをグループ化しました。各ディレクトリには、1つのアクションファイル(Nのエクスポート)と1つのレデューサーファイル(Nのエクスポート)が含まれます。また、あなたの行動が時間とともにどのように進化するかを考えるのにも役立ちます。私は、アクションが現在または将来の副作用を含んでいる可能性があるため、アクションには設計に多くの時間が必要であることがわかりました。 –

+0

Danはそれについて次のように言います。http:// stackoverflow。com/questions/35357629/where-to-put-model-specific-business-in-a-redux-app – JordanHendrix

+0

@MattLo、ドメイン単位でロジックをグループ化し、 、エンティティなど)、各フォルダに2つのファイル(ACファイルとSRファイル)があります。 – Artin

答えて

0

あなたはかなりの可能性を取り上げました。残念ながら、ワンサイズの答えはありません。それはあなたのアプリだ、あなたが決定する必要があります。

structuring business logicのRedux FAQの回答には、このトピックに関する良い引用があり、関連するいくつかのディスカッションへのリンクがあります。

+1

公式FAQは、私の正確な質問に対処します。私はそれを見て答えます: "はい、あなたのBLを見つけるために2つの場所があります。あなたのコードを整理する方法(太ったAC /薄いSR)、またはその逆の詩"を自分で決めてください。 1 - 私はACでの非同期アクションの位置を強制的に見つけたので、(AC /薄型SR)シナリオを実行するオプションが表示されません。 2 - 理想的には、Reduxの上に構築されたフレームワークを好むでしょう。私とチームメイトには具体的なアプローチの1つを強制し、開発者の規律に任せないようにします。 – Artin

+0

ええ、実際には、この問題についてhttps://github.com/reactjs/redux/issues/1171にコメントが追加されています。 私のReduxライブラリリストに関連するものは、https://github.com/markerikson/redux-ecosystem-linksにあります。特に "バリエーション"ページには、Reduxをベースとして使用するライブラリが多数ありますが、そこからいくつかの特定の方向に進みます。 絶対パターンを厳密に強制するものはありません。 – markerikson

関連する問題