-
Notifications
You must be signed in to change notification settings - Fork 2k
JSONファイルとVueの間に中間層を設ける #3008
JSONファイルとVueの間に中間層を設ける #3008
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
気になる点,いくつかコメントしました.(コメントしていないけれどコメントした箇所と同様のところもあります)
本来はこの PR とは別に対処すべきかもしれませんので,お手すきであれば直して頂いて,そうでなければ私の方で後ほどリファクタリングします.
@nard-tech
恐らく #3008 (comment) あたりのことだと思いますが、どのプロパティをどこで使っているか把握した上で最適化する必要があってその上数が多いので、このPRに混ぜるとややこしそうですし別PRでのリファクタリングをお願い致します!(ちゃんと書くならキャメルケースにしたほうが良いと思うので ただ、そのスコープ内の計算に使うだけなら分割代入をしてしまうとシャローコピーが走ってしまうので対象のプロパティを変数に格納して参照は維持したままにしたほうが良いかもしれません。dataの戻り値も新規にオブジェクトを作成しますが参照は持っている(はず。Vueがdataの戻り値をどう処理しているかによります)のでシャローコピーが走ると無駄になっちゃいます。でもシャローコピーなら重くないのでこのあたりの計算コストと可読性をどうするかはお任せ致します! |
@hikyaru-suzuki お疲れさまです.
そうですね.別PRで着手することにします.
スネークケースとキャメルケースが混在してしまっているのは気持ち悪いですよね.(cf. #3108)
8b36fe1 に限らず,components 以下のファイルは全体的に荒れている感があると思っています.
難しいところですね.大勢が編集に参加するのであれば可読性と「美しさ」重視の方がいいのかなと思いますが,実際に修正を入れるときにバランスを考慮したいと思います. |
@hikyaru-suzuki そして,conflict してしまっているので修正をお願いします… (追記)#2916 の merge の後の方がいいかもしれません. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(追記)#2916 の merge の後の方がいいかもしれません.
承知いたしました! #2916 のマージ後にコンフリクト解決を行ってまたご連絡します!
スネークケースとキャメルケースが混在してしまっているのは気持ち悪いですよね.(cf. #3108)
こちらについてですが、quicktypeのオプションを使うことでキャメルケースへ自動変換することが出来ます。当然Vue側の修正も必要となってきますが、今回型付けによって以前よりは楽に対応できるのではないでしょうか
今回自動生成の際に入れようか迷いましたがVue側も大掛かりな変更になるので今回のPRの責務外かなと思い有効にしませんでした
こういうことを出来るのがデータ実態とアプリコードの間に一枚挟む設計の良さですよね〜
$ yarn -s run quicktype --help
Synopsis
$ quicktype [--lang LANG] [--out FILE] FILE|URL ...
~~中略~~
Options for TypeScript
--[no-]just-types Interfaces only (off by default)
--[no-]nice-property-names Transform property names to be JavaScripty (off by default)
--[no-]explicit-unions Explicitly name unions (off by default)
--[no-]runtime-typecheck Verify JSON.parse results at runtime (on by default)
--acronym-style original|pascal|camel|lowerCase Acronym naming style
--converters top-level|all-objects Which converters to generate (top-level by default)
~~中略~~
--[no-]nice-property-names Transform property names to be JavaScripty (off by default)
このオプションを有効にすることでキャメルケースに変換されます。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
実際に手元で実行してみました
libraries/auto_generated/data_converter/convertMetro.ts
を例にするとこんな感じとなります
lang: 'ts', | ||
out: path.resolve(outputPath, `convert${pascalFileName}.ts`), | ||
topLevel: pascalFileName, | ||
src: [path.resolve(inputPath, sourceFileName)] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
オプションを有効化すると
src: [path.resolve(inputPath, sourceFileName)] | |
src: [path.resolve(inputPath, sourceFileName)], | |
rendererOptions: { 'nice-property-names': 'true' } |
export interface Metro { | ||
date: string; | ||
datasets: Dataset[]; | ||
labels: string[]; | ||
base_period: string; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Interfaceの定義がキャメルケースに変換されて
export interface Metro { | |
date: string; | |
datasets: Dataset[]; | |
labels: string[]; | |
base_period: string; | |
} | |
export interface Metro { | |
date: string; | |
datasets: Dataset[]; | |
labels: string[]; | |
basePeriod: string; | |
} |
{ json: "date", js: "date", typ: "" }, | ||
{ json: "datasets", js: "datasets", typ: a(r("Dataset")) }, | ||
{ json: "labels", js: "labels", typ: a("") }, | ||
{ json: "base_period", js: "base_period", typ: "" }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
実際に変換を行う関数にその情報が伝えられます
{ json: "base_period", js: "base_period", typ: "" }, | |
{ json: "base_period", js: "basePeriod", typ: "" }, |
@nard-tech (メンション忘れていました) ここで議論すべきではないと思いますが
のように統一していけたらきれいで見やすいコードになるかと! |
@hikyaru-suzuki 丁寧に解説頂きありがとうございます.ESLint の設定も,不慣れですがやってみようと思っています. |
という状況なので,こちらもしばらく置いておいた方がよさそうですね. |
@kaizumaki こちらの close もお願いします. |
👏 解決する issue / Resolved Issues
📝 関連する issue / Related Issues
⛏ 変更内容 / Details of Changes
メイン
libraries
ディレクトリにビルド後参照されるTypeScriptファイルを集約(utils
ディレクトリを移動)libraries/auto_generated
に配置その他
~/
を@/
に統一設計について
Vue -> RepositoryのInterface <- Repositoryの実装 -> JSONファイル
という依存関係にすることでVue側からはRepositoryの実装変更やマスターデータの実態を意識することなくVue側の実装を行うことが可能となりますlibraries/Registry.ts
にて一元管理しています。このクラス内でpublic static readonlyなInterfaceの型で宣言したプロパティにインスタンス化したオブジェクトをDIしていますポイント