オブジェクト向けの重要性
オブジェクト向けコードの原則を守らなければ、
変更が発生した場合は、次のようにクライアントコードを変更する必要があります.
実装クラス(FixDiscountPolicy、RateDiscountPolicy)にも依存
コードは抽象インタフェースにのみ依存します
=>インプリメンテーションオブジェクトの作成と注入が必要なクラス
AppConfigクラスの作成
依存関係を外部からの注入と見なす
=>注入依存関係(注入依存性)
AppConfigの使用
(AppConfigの割引ポリシーメソッドを簡単に変更すれば、残りのコードXを変更する必要があります)
上記のコードは、純粋なJavaコードではなくSpringコードで記述できるようになりました.
AppConfig class
スプリングクエリーの使用
スプリングの必要性はまだ感じられない.
スプリングを使う理由は何ですか?
次の投稿に進みます...
変更が発生した場合は、次のようにクライアントコードを変更する必要があります.
public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
=>クラスはDiscountPolicyインタフェースです.実装クラス(FixDiscountPolicy、RateDiscountPolicy)にも依存
コードは抽象インタフェースにのみ依存します
private DiscountPolicy discountPolicy;
前述の通り、Null Pointer Exception(NPE)が発生するのは当然です=>インプリメンテーションオブジェクトの作成と注入が必要なクラス
AppConfigクラスの作成
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
注入OrderServiceImplジェネレータpublic class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
クライアントOrderServiceImplに表示されます.依存関係を外部からの注入と見なす
=>注入依存関係(注入依存性)
AppConfigの使用
public class MemberApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
}
}
これらのコードを記述することで、変更が閉じる可能性があります.(AppConfigの割引ポリシーメソッドを簡単に変更すれば、残りのコードXを変更する必要があります)
Springの使用
上記のコードは、純粋なJavaコードではなくSpringコードで記述できるようになりました.
AppConfig class
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
Spring IOCコンテナ管理の対象Beanで管理しています.スプリングクエリーの使用
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
メソッド名を使用してメソッドを呼び出すことができます.スプリングの必要性はまだ感じられない.
スプリングを使う理由は何ですか?
次の投稿に進みます...
Reference
この問題について(オブジェクト向けの重要性), 我々は、より多くの情報をここで見つけました https://velog.io/@bty5596/객체-지향의-중요성テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol