2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

設定ファイルを読み書きする時は専用のクラスを作れ

1 :デフォルトの名無しさん:2017/08/20(日) 23:54:22.47 ID:ooMVqCZ7.net
よっぽど小さいプログラムでない限り
YAMLやJSONなどを読み込んでハッシュにしたものを参照するのではなく
設定ファイルクラスを作ってアクセスするべきである
理由は拡張性や互換性を保ってシンプルに使えるようにするため

2 :デフォルトの名無しさん:2017/08/21(月) 00:15:34.85 ID:jpEJzG1z.net
-完

3 :デフォルトの名無しさん:2017/08/21(月) 00:16:19.90 ID:2fQ5BmBo.net
再開

4 :デフォルトの名無しさん:2017/08/21(月) 01:01:36.37 ID:7hohe37q.net
これは誰も反対するやついないわ
つかわざわざ自作しなくても標準でそういう機能が用意されてるか
一般的によく使われてるライブラリがあると思うぞ

5 :デフォルトの名無しさん:2017/08/21(月) 01:36:10.97 ID:DtUMsypO.net
xmlを使ってたけど
でかくなると文字列処理だから
超おっそいぜ

6 :デフォルトの名無しさん:2017/08/21(月) 01:47:39.56 ID:DtUMsypO.net
>>1
この程度の処理大事にするほどのもんかなぁ?
dobon貼れば終わるんだろ?

7 :デフォルトの名無しさん:2017/08/21(月) 01:49:20.42 ID:DtUMsypO.net
読み込みクソ重いのに
20msに一回とか言われっと
速度ベースで考えないと駄目なときも

8 :デフォルトの名無しさん:2017/08/21(月) 09:34:07.48 ID:2fQ5BmBo.net
>>4
> つかわざわざ自作しなくても標準でそういう機能が用意されてるか
> 一般的によく使われてるライブラリがあると思うぞ

いや違う。そういう話じゃない。
例えばApacheであればApache専用の設定クラスを作るということ
そして自作のMyAppであればMyAppConfigという専用のクラスを作るということ

9 :デフォルトの名無しさん:2017/08/21(月) 10:52:50.57 ID:A2JiXS2f.net
まんこはマジ臭い
ちんこの比じゃない

10 :デフォルトの名無しさん:2017/08/21(月) 11:09:33.97 ID:LLeZ/OpM.net
ケースバイケースじゃん
そもそもどこに持つんだよ?
ってのと
通信設定なのかログ設定なのか
製品設定なのか表示設定なのか
ユーザ毎の設定なんてデータベースだし
あの場合はこの場合は?
ってすべてを包括できるもんはできんと思うがどうか?

11 :デフォルトの名無しさん:2017/08/21(月) 12:41:30.44 ID:2fQ5BmBo.net
>>10
だからこそ、その違いをクラスで吸収するんだよ

もし専用のクラスがなかったら、その設定項目を利用するたびに
ファイルから取得しようかデータベースから取得しようか
考えないといけなくなるだろ

12 :デフォルトの名無しさん:2017/08/21(月) 12:48:33.17 ID:2fQ5BmBo.net
例えば、ある設定値を取得する場合を考える。

具体的にログのファイル名とするか?
設定ファイルで設定している場合は、そのファイル名
そうでなければ /tmp/myapp.log に出力するものとする。

この時、config = YAML.load("config.yaml") みたいに
専用のクラスを作らない場合は、

log_file = config["log_file"] || DEFAULT_LOG_FILE
みたいなコードを阿智事に書かないといけなくなる

MyConfigみたいなものを作っていれば、

log_file = my_config.log_file とするだけで良くなる。

13 :デフォルトの名無しさん:2017/08/21(月) 12:51:37.97 ID:2fQ5BmBo.net
> みたいなコードを阿智事に書かないといけなくなる
なんだこれw 「あちこち」な

14 :デフォルトの名無しさん:2017/08/21(月) 13:03:59.99 ID:2fQ5BmBo.net
また別の話として、設定ファイルに

log_file = 任意のファイル名

という風にログファイル名が書かれている場合はログに出力するが、
何も書かれていなければ出力しないという仕様だったとする。

ある時、ファイル名は書いているが一時的に無効にしたいという要望がでたため

log_enabled = true
log_file = 任意のファイル名

以下のような仕様に変えたとする
(MySQL の general_log = 0 で無効になるのと同じような仕様だな)

この場合専用のクラスがなければあちこちで、

if log_file を if log_enabled && log_file みたいに書き換えないといけない。
だけど専用のクラスがあれば、内部で吸収できる

設定ファイルに log_enabled が書いていなくても、デフォルト値をtrueにすることなんて簡単だし
log_enabledがtrueの場合だけ、log_fileを返すようにすることで、今までと互換性を保つことができる。

それだけじゃない。設定値を返すのではなく専用の設定クラスから直接Loggerオブジェクトを
返すようにすれば、NullLogger(つまり何も出力しないログクラス)を作ることで、
if log_file 自体も無くすことができる

アプリの中にある、あらゆる "設定ファイルの解釈" を設定クラス自身にさせることで
アプリからは単純な設定として参照できるようになるんだよ

15 :デフォルトの名無しさん:2017/08/21(月) 13:17:27.75 ID:2fQ5BmBo.net
あと容易に思いつくだろうけど、
専用のクラスがあれば、設定ファイルをXMLからYAMLに変えることだって簡単にできる
単に内部のファイル形式が変わるだけで、クラスのインターフェースは変わらないからね。

それから設定ファイルの構造を変えるのも簡単になる。
例えばもともとini形式で
[DATA]
file_0_title = "ファイル0"
file_0_path = "/path/to/file0"
file_1_title = "ファイル1"
file_1_path = "/path/to/file1"

みたいなものを単純にYAML化してこんなことしちゃっても
data:
- file_0_title: ファイル0
- file_0_path: /path/to/file0
- file_1_title: ファイル1
- file_1_path: /path/to/file1

あとからこのように変えることだってできる。
data:
files:
- title: ファイル0
- path: /path/to/file0
- title: ファイル1
- path: /path/to/file1

なぜなら設定クラスのインターフェースはini形式の時代から
設定クラス内で解釈することによって、config.data.files とすることだってできるし、
互換性のために、config.data.file_0_title という参照方法を残すことだってできる。

設定値を単純にハッシュにして参照するのではなく、クラスにラップすることでこういうメリットが有るわけだよ

16 :デフォルトの名無しさん:2017/08/21(月) 15:21:51.60 ID:7hohe37q.net
>>8
RailsならRails configuration object
設定管理を一箇所にまとめるのは至極当然のこと

一箇所にまとめずに
log_file = config["log_file"] || DEFAULT_LOG_FILEとかif log_fileとか
そういうのをあちこちに書いてるほうが普通じゃないよ

17 :デフォルトの名無しさん:2017/08/21(月) 17:00:48.95 ID:Vd6YV+e7.net
>>15
ここだけそうじゃ無くしたい
に弱そう(´・ω・`)

18 :デフォルトの名無しさん:2017/11/12(日) 09:23:11.76 ID:NsRragGc.net
pythonista「クラスって結局辞書やろ?」

19 :デフォルトの名無しさん:2018/05/23(水) 21:17:12.01 ID:Au5e7VGg.net
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

2215S

20 :デフォルトの名無しさん:2018/07/05(木) 00:40:34.15 ID:RfoszcD2.net
8SX

21 :デフォルトの名無しさん:2020/01/03(金) 22:48:47.16 ID:/JlKJf5i.net
おまんこー

総レス数 21
8 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★