回答編集履歴

2

さらに変更

2016/12/09 14:20

投稿

naomi3
naomi3

スコア1105

test CHANGED
@@ -6,25 +6,45 @@
6
6
 
7
7
  class B、class C はvalueをどのクラスが持っているか、気にしなくてもよいようにしました。
8
8
 
9
+ さらに変更
10
+
11
+ valueを直接所有しているクラスはValueOwnerを実装し、valueを間接利用しているクラスはValueSharerを実装して役割を明確化しました。
12
+
13
+ valueを直接所有しているclass Aだけは、クラスの生成法もクラス間の関係も知っている、というイメージです。
14
+
9
15
 
10
16
 
11
17
  ```Java
12
18
 
13
- public interface ValueSharer {
19
+ interface ValueAccessor {
14
20
 
15
- int getValue();
21
+ int getValue();
16
22
 
17
- void setValue(int value);
23
+ void setValue(int value);
18
24
 
19
25
  }
20
26
 
21
27
 
22
28
 
29
+ interface ValueOwner extends ValueAccessor {
30
+
31
+ void setSharers(ValueSharer... sharers);
32
+
33
+ }
23
34
 
24
35
 
25
- class A implements ValueSharer {
26
36
 
37
+ interface ValueSharer extends ValueAccessor {
38
+
39
+ void setOwner(ValueOwner owner);
40
+
41
+ }
42
+
43
+
44
+
45
+ class A implements ValueOwner {
46
+
27
- int value;
47
+ private int value;
28
48
 
29
49
 
30
50
 
@@ -32,9 +52,27 @@
32
52
 
33
53
  A a = new A();
34
54
 
35
- B b = new B(a);
55
+ B b = new B();
36
56
 
37
- C c = new C(a);
57
+ C c = new C();
58
+
59
+
60
+
61
+ a.setSharers(b, c);
62
+
63
+ }
64
+
65
+
66
+
67
+ @Override
68
+
69
+ public void setSharers(ValueSharer... sharers) {
70
+
71
+ for (ValueSharer sharer : sharers) {
72
+
73
+ sharer.setOwner(this);
74
+
75
+ }
38
76
 
39
77
  }
40
78
 
@@ -58,19 +96,23 @@
58
96
 
59
97
  }
60
98
 
99
+
100
+
61
101
  }
62
102
 
63
103
 
64
104
 
65
105
  class B implements ValueSharer {
66
106
 
67
- ValueSharer sharer = null;
107
+ private ValueOwner owner;
68
108
 
69
109
 
70
110
 
71
- B(ValueSharer sharer) {
111
+ @Override
72
112
 
113
+ public void setOwner(ValueOwner owner) {
114
+
73
- this.sharer = sharer;
115
+ this.owner = owner;
74
116
 
75
117
  }
76
118
 
@@ -80,7 +122,7 @@
80
122
 
81
123
  public int getValue() {
82
124
 
83
- return sharer.getValue();
125
+ return owner.getValue();
84
126
 
85
127
  }
86
128
 
@@ -90,7 +132,7 @@
90
132
 
91
133
  public void setValue(int value) {
92
134
 
93
- sharer.setValue(value);
135
+ owner.setValue(value);
94
136
 
95
137
  }
96
138
 

1

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

2016/12/09 14:20

投稿

naomi3
naomi3

スコア1105

test CHANGED
@@ -1,26 +1,28 @@
1
1
  interfaceを使ってgetValue,setValue と setAの実装を強制づけてみました。
2
+
3
+ 変更
4
+
5
+ 依存度を下げてみました。
6
+
7
+ class B、class C はvalueをどのクラスが持っているか、気にしなくてもよいようにしました。
8
+
9
+
2
10
 
3
11
  ```Java
4
12
 
5
- public interface AccessibleToValue {
13
+ public interface ValueSharer {
6
14
 
7
- int getValue();
15
+ int getValue();
8
16
 
9
- void setValue(int value);
17
+ void setValue(int value);
10
18
 
11
19
  }
12
20
 
13
21
 
14
22
 
15
- public interface SharingValue {
16
-
17
- void setA(A a);
18
-
19
- }
20
23
 
21
24
 
22
-
23
- public class A implements AccessibleToValue {
25
+ class A implements ValueSharer {
24
26
 
25
27
  int value;
26
28
 
@@ -30,15 +32,9 @@
30
32
 
31
33
  A a = new A();
32
34
 
33
- B b = new B();
35
+ B b = new B(a);
34
36
 
35
- C c = new C();
37
+ C c = new C(a);
36
-
37
-
38
-
39
- b.setA(a);
40
-
41
- c.setA(a);
42
38
 
43
39
  }
44
40
 
@@ -66,17 +62,15 @@
66
62
 
67
63
 
68
64
 
69
- public class B implements AccessibleToValue, SharingValue {
65
+ class B implements ValueSharer {
70
66
 
71
- A a;
67
+ ValueSharer sharer = null;
72
68
 
73
69
 
74
70
 
75
- @Override
71
+ B(ValueSharer sharer) {
76
72
 
77
- public void setA(A a) {
78
-
79
- this.a = a;
73
+ this.sharer = sharer;
80
74
 
81
75
  }
82
76
 
@@ -86,7 +80,7 @@
86
80
 
87
81
  public int getValue() {
88
82
 
89
- return a.getValue();
83
+ return sharer.getValue();
90
84
 
91
85
  }
92
86
 
@@ -96,7 +90,7 @@
96
90
 
97
91
  public void setValue(int value) {
98
92
 
99
- a.setValue(value);
93
+ sharer.setValue(value);
100
94
 
101
95
  }
102
96
 
@@ -104,39 +98,9 @@
104
98
 
105
99
 
106
100
 
107
- public class C implements AccessibleToValue, SharingValue {
101
+ class C implements ValueSharer {
108
102
 
109
- A a;
110
-
111
-
112
-
113
- @Override
114
-
115
- public void setA(A a) {
103
+ // class B と同様
116
-
117
- this.a = a;
118
-
119
- }
120
-
121
-
122
-
123
- @Override
124
-
125
- public int getValue() {
126
-
127
- return a.getValue();
128
-
129
- }
130
-
131
-
132
-
133
- @Override
134
-
135
- public void setValue(int value) {
136
-
137
- a.setValue(value);
138
-
139
- }
140
104
 
141
105
  }
142
106