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

回答編集履歴

5

MmHgをイミュータブルに変更。

2016/12/07 04:49

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -31,7 +31,7 @@
31
31
  ```
32
32
  public struct MmHg
33
33
  {
34
- private decimal value;
34
+ private readonly decimal value;
35
35
  public MmHg(decimal value, PressureUnit unit)
36
36
  {
37
37
  // それぞれのケースでmmHg化する

4

加筆

2016/12/07 04:49

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -59,7 +59,9 @@
59
59
  ```
60
60
 
61
61
  面倒じゃなければ残りの3つもクラスにします。
62
- その場合はAsメソッド群つくらず、お互いにキャスト可能にします。
62
+ その場合はパブリックコンストラクタもAsメソッド群つくらず、お互いにキャスト可能にします。
63
+ 変換関数のパターンがクラス数分増えてしまいますが、それを簡易化する場合は一度全部統一単位に変換するようにすると簡単です。
64
+ ※変換関数に誤差が含まれる場合は繰り返すほど誤差が大きくなるので注意が必要です。
63
65
  ```
64
66
  public struct HectoPascal;
65
67
  public struct Bar;

3

誤字の修正

2016/12/07 04:45

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  他の回答を見るに、mmHgをデフォルトにしたい…のかなと思いますので、それをベースに回答します。
28
28
  mmHg用のクラスを1個作成して、各値からコンバートできるパブリックコンストラクタと、変換用の関数を作ります。
29
- 全部の値を生の値で保持したい場合でも変数をいくつも持つのはオススメしがたいです。
29
+ 全部の値を生の値で保持したい場合でも変数をいくつも一つのクラスで持つのはオススメしがたいです。
30
30
 
31
31
  ```
32
32
  public struct MmHg

2

誤字の修正

2016/12/07 04:43

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -24,7 +24,7 @@
24
24
  このため、質問の回答とはちょっとズレます。
25
25
  なんていうか、プロパティとして直接hPaとかが実装される、ようなことは避ける、というのが回答でしょうか。
26
26
 
27
- 他の回答を見るに、mmHgをデフォルトにしたい…のかと思いますので、それをベースに回答します。
27
+ 他の回答を見るに、mmHgをデフォルトにしたい…のかと思いますので、それをベースに回答します。
28
28
  mmHg用のクラスを1個作成して、各値からコンバートできるパブリックコンストラクタと、変換用の関数を作ります。
29
29
  全部の値を生の値で保持したい場合でも変数をいくつも持つのはオススメしがたいです。
30
30
 

1

質問の回答になってなかったので追記

2016/12/07 04:42

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -21,15 +21,18 @@
21
21
 
22
22
  あと、変数の内部は常に1種類の単位で持っておく方が僕は好みです。
23
23
  一つの文脈に複数の状態が混在するのを忌避するからですが。
24
+ このため、質問の回答とはちょっとズレます。
25
+ なんていうか、プロパティとして直接hPaとかが実装される、ようなことは避ける、というのが回答でしょうか。
24
26
 
27
+ 他の回答を見るに、mmHgをデフォルトにしたい…のなかと思いますので、それをベースに回答します。
25
- 他の回答を見るに、mmHgをデフォルトにしたかったらそれでクラス1個成して、各値からコンバートできるパブリックコンストラクタと、変換用の関数を作ります。
28
+ mmHg用のクラス1個成して、各値からコンバートできるパブリックコンストラクタと、変換用の関数を作ります。
26
29
  全部の値を生の値で保持したい場合でも変数をいくつも持つのはオススメしがたいです。
27
30
 
28
31
  ```
29
- public struct MercuryMillimetre
32
+ public struct MmHg
30
33
  {
31
34
  private decimal value;
32
- public MercuryMillimetre(decimal value, PressureUnit unit)
35
+ public MmHg(decimal value, PressureUnit unit)
33
36
  {
34
37
  // それぞれのケースでmmHg化する
35
38
  switch(unit)
@@ -61,4 +64,23 @@
61
64
  public struct HectoPascal;
62
65
  public struct Bar;
63
66
  public struct Psi;
67
+
68
+ // 圧力という文脈にしてしまいたい場合は以下のような感じで改めてぼかす。。。
69
+ // Box化が微妙なんだけど仕方ない。。。
70
+ public struct Pressure
71
+ {
72
+ private readonly object value;
73
+ public Pressure(HectoPascal value) { this.value = value; }
74
+ public Pressure(MmHg value) { this.value = value; }
75
+ public Pressure(Bar value) { this.value = value; }
76
+ public Pressure(Psi value) { this.value = value; }
77
+
78
+ public HectoPascal AsHectoPascal { get { return (HectoPascal)value; } }
79
+ public MmHg AsMmHg { get { return (MmHg)value; } }
80
+ public Bar AsBar { get { return (Bar)value; } }
81
+ public Psi AsPsi { get { return (Psi)value; } }
82
+ }
64
- ```
83
+ ```
84
+
85
+ mmHgだけは悩みます…単位をそのままクラスにするなら問答無用でMmHgです。(規約を破りたくないので。)
86
+ もしくは、元の名前を使います。Millimeter of mercuryなんで、MillimeterOfMercuryですかね。