実際の開発、マルチステージのような複雑なサービスインターフェイスパラメータの多くは、様々なJSONまたはネストされた配列と混合される場合。
組み立てロジック今回我々はコントローラー層で雑然とインターフェイスパラメータを記述する場合は、コードの可読性が非常に悪くなり、フォローアップパラメータのパラメータのパラメータを推定するよりも、フロントインターフェース文書アセンブリロジックを引き継ぐが必要です。
この場合、インターフェースコールは、DTOが大幅に読みやすさを向上させることができるカスタム注釈と、カプセル化データ伝送をオブジェクトパラメータ。
私たちは、DTOのパラメータを識別するためのコメントをカスタマイズします。
@Retention(RetentionPolicy.RUNTIME) @Target(値 = ElementType.FIELD) パブリック @ インタフェースParamAnnotation { // 必要に応じてパラメータ パブリック ブール IsRequiredこの()デフォルト はfalse ; // パラメータ名 パブリック文字列名(); }
メモ必要に応じて2つのプロパティパラメータ名とパラメータが含まれています。
このように、我々のコードの構成は次のとおりです。
への変更:
私たちはグループの関連割り当てロジックは、コンストラクタのDTOにカプセル化されることができますが重要なのは、読みやすさを改善しました。
我々は走査チェックDTOに反射によって完了できるかどうかを各呼び出しインタフェースは、パラメータを渡す必要があります前に:
/ ** * @author NXY * @date 2020年3月24日夜07時49分 * @Param OBJ:パラメータオブジェクトを検証する必要 * @return * @exception * @descriptionパラメータを記入する必要があるかどうかを判断する * / パブリック ブール isCompleteは(T OBJ)スローIllegalAccessExceptionが、持たないNoSuchFieldExceptionを{ クラスobjclass = obj.getClass() フィールド、フィールド[] = objClass.getDeclaredFields(); 用(フィールド、フィールド:フィールド){ IF(field.isAnnotationPresent(ParamAnnotationのクラス)) { field.setAccessible(trueに)。 ParamAnnotation ParamAnnotation = field.getAnnotation(ParamAnnotation。クラス); // もし必要 IF (paramAnnotation.isRequired()){ Object値 = Field.get(OBJ); IF(ヌル == 値){ オブジェクトParaName = paramAnnotation .nameの(); // 不足している項目はライトバック フィールド、削除= objClass.getDeclaredField( "削除" ;) (deletion.setAccessible trueにします)。 deletion.set(OBJ、paraName)。 リターン はfalse ; } } } } 戻り 真。 }
だから、コードの行数十によって私達の外側の層のロジックになること:
Voは、パラメータ、整合性チェックパラメータによって得られたDTO。ロジックコントローラのみが残りの断片的な変換に注意を呼び出し、モジュラーチェックしてみましょう。
コードの読みやすさと引き換えに、これらのコストと低動作効率が、シーンの性能要件には特に高くはないが、反射しながら価値がそれです。