質問するログイン新規登録

回答編集履歴

2

さらに変更

2016/12/09 14:20

投稿

naomi3
naomi3

スコア1105

answer CHANGED
@@ -2,24 +2,43 @@
2
2
  変更
3
3
  依存度を下げてみました。
4
4
  class B、class C はvalueをどのクラスが持っているか、気にしなくてもよいようにしました。
5
+ さらに変更
6
+ valueを直接所有しているクラスはValueOwnerを実装し、valueを間接利用しているクラスはValueSharerを実装して役割を明確化しました。
7
+ valueを直接所有しているclass Aだけは、クラスの生成法もクラス間の関係も知っている、というイメージです。
5
8
 
6
9
  ```Java
7
- public interface ValueSharer {
10
+ interface ValueAccessor {
8
- int getValue();
11
+ int getValue();
9
- void setValue(int value);
12
+ void setValue(int value);
10
13
  }
11
14
 
15
+ interface ValueOwner extends ValueAccessor {
16
+ void setSharers(ValueSharer... sharers);
17
+ }
12
18
 
13
- class A implements ValueSharer {
19
+ interface ValueSharer extends ValueAccessor {
14
- int value;
20
+ void setOwner(ValueOwner owner);
21
+ }
15
22
 
23
+ class A implements ValueOwner {
24
+ private int value;
25
+
16
26
  public static void main(String[] args) {
17
27
  A a = new A();
18
- B b = new B(a);
28
+ B b = new B();
19
- C c = new C(a);
29
+ C c = new C();
30
+
31
+ a.setSharers(b, c);
20
32
  }
21
33
 
22
34
  @Override
35
+ public void setSharers(ValueSharer... sharers) {
36
+ for (ValueSharer sharer : sharers) {
37
+ sharer.setOwner(this);
38
+ }
39
+ }
40
+
41
+ @Override
23
42
  public int getValue() {
24
43
  return value;
25
44
  }
@@ -28,23 +47,25 @@
28
47
  public void setValue(int value) {
29
48
  this.value = value;
30
49
  }
50
+
31
51
  }
32
52
 
33
53
  class B implements ValueSharer {
34
- ValueSharer sharer = null;
54
+ private ValueOwner owner;
35
55
 
56
+ @Override
36
- B(ValueSharer sharer) {
57
+ public void setOwner(ValueOwner owner) {
37
- this.sharer = sharer;
58
+ this.owner = owner;
38
59
  }
39
60
 
40
61
  @Override
41
62
  public int getValue() {
42
- return sharer.getValue();
63
+ return owner.getValue();
43
64
  }
44
65
 
45
66
  @Override
46
67
  public void setValue(int value) {
47
- sharer.setValue(value);
68
+ owner.setValue(value);
48
69
  }
49
70
  }
50
71
 

1

依存度を下げた設計に修正

2016/12/09 14:20

投稿

naomi3
naomi3

スコア1105

answer CHANGED
@@ -1,24 +1,22 @@
1
1
  interfaceを使ってgetValue,setValue と setAの実装を強制づけてみました。
2
+ 変更
3
+ 依存度を下げてみました。
4
+ class B、class C はvalueをどのクラスが持っているか、気にしなくてもよいようにしました。
5
+
2
6
  ```Java
3
- public interface AccessibleToValue {
7
+ public interface ValueSharer {
4
- int getValue();
8
+ int getValue();
5
- void setValue(int value);
9
+ void setValue(int value);
6
10
  }
7
11
 
8
- public interface SharingValue {
9
- void setA(A a);
10
- }
11
12
 
12
- public class A implements AccessibleToValue {
13
+ class A implements ValueSharer {
13
14
  int value;
14
15
 
15
16
  public static void main(String[] args) {
16
17
  A a = new A();
17
- B b = new B();
18
+ B b = new B(a);
18
- C c = new C();
19
+ C c = new C(a);
19
-
20
- b.setA(a);
21
- c.setA(a);
22
20
  }
23
21
 
24
22
  @Override
@@ -32,41 +30,25 @@
32
30
  }
33
31
  }
34
32
 
35
- public class B implements AccessibleToValue, SharingValue {
33
+ class B implements ValueSharer {
36
- A a;
34
+ ValueSharer sharer = null;
37
35
 
38
- @Override
39
- public void setA(A a) {
36
+ B(ValueSharer sharer) {
40
- this.a = a;
37
+ this.sharer = sharer;
41
38
  }
42
39
 
43
40
  @Override
44
41
  public int getValue() {
45
- return a.getValue();
42
+ return sharer.getValue();
46
43
  }
47
44
 
48
45
  @Override
49
46
  public void setValue(int value) {
50
- a.setValue(value);
47
+ sharer.setValue(value);
51
48
  }
52
49
  }
53
50
 
54
- public class C implements AccessibleToValue, SharingValue {
51
+ class C implements ValueSharer {
55
- A a;
56
-
57
- @Override
58
- public void setA(A a) {
52
+ // class B と同様
59
- this.a = a;
60
- }
61
-
62
- @Override
63
- public int getValue() {
64
- return a.getValue();
65
- }
66
-
67
- @Override
68
- public void setValue(int value) {
69
- a.setValue(value);
70
- }
71
53
  }
72
54
  ```