Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

APIクライアントのFactoryを作って、動的にAPIクライアントを変更できるようにする #420

Merged
merged 6 commits into from
Oct 31, 2021

Conversation

yamachu
Copy link
Member

@yamachu yamachu commented Oct 30, 2021

内容

OpenAPIのAPIクライアントは audio.ts でインスタンス化され、Storeで対象のインスタンスに依存するように実装されている。
そのため動的にインスタンスを変更するのが困難であり、StoreのMutationなどにEngineに接続するためのClientの変更を行う関数などを実装をするなどの変更が必要である。
また audio.ts は音声に関する知識だけを持っていてほしいので設計がいびつになることは想像に難くない。

そのため本PRではstoreに直接APIクライアントに依存させず、storeの状態に管理されたFactoryに依存する形に変更する。
この変更により、FactoryのInterfaceを実装したMockのFactoryをStoreのstateに入れることで、EngineなしにUIやStoreの開発も容易になる。(実際の所electron依存のところもInterfaceにする必要はある…)

関連 Issue

ref: https://github.com/Hiroshiba/voicevox/issues/220

スクリーンショット・動画など

その他

@@ -112,6 +109,7 @@ export const audioStoreState: AudioStoreState = {
audioKeys: [],
audioStates: {},
nowPlayingContinuously: false,
_engineFactory: OpenAPIEngineConnectorFactory,
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AudioStore に持たせるのもなんか違う気がしている
window.electronとか使ってるのもinfrastructuresとか言う層として扱って、別途Storeを作り、そのStateに突っ込むのがいいのではないかとか思っている

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

たしかに別Storeがあっても良いかなと思いました。

vuexの仕様がわからないのですが、OpenAPIEngineConnectorFactoryをstateに入力しても良いのかがわからないでいます。
Vueのrefreactiveに入力可能なものであれば良いのかなと思いました。
ref(関数)ってできるんでしょうか・・・?)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FirebaseのUserをStateに突っ込んでいるプロダクトとかも調べてみるとあるので、大丈夫なのかなとは思っていましたが、Documentをちゃんと読んでいないので断言できないですね…
またIssueにStateはShould be serializableだとは言っているので、今回のはあまり良くなさそうではありますね…
vuejs/vuex#757 (comment)
(2017年から変わったのかしら…)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AudioStoreのtestをしたくなったらCreatorもexportして、IEngineConnectorFactoryを実装したものを流し込めば良いのかな、と思ってます

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

良いと思います!!
ネストが一段増えちゃうのでちょっとだけコーディングが難しくなったかもですが、まあやろうと思えばmutationとかだけ取り出せたりもするので、この形で良いのかなと思いました。

@yamachu yamachu marked this pull request as ready for review October 30, 2021 11:34
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

engineHostを変更可能にする良い実装に感じました・・・!
ちょっと不安だったのでコメントしてみました。

@@ -112,6 +109,7 @@ export const audioStoreState: AudioStoreState = {
audioKeys: [],
audioStates: {},
nowPlayingContinuously: false,
_engineFactory: OpenAPIEngineConnectorFactory,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

たしかに別Storeがあっても良いかなと思いました。

vuexの仕様がわからないのですが、OpenAPIEngineConnectorFactoryをstateに入力しても良いのかがわからないでいます。
Vueのrefreactiveに入力可能なものであれば良いのかなと思いました。
ref(関数)ってできるんでしょうか・・・?)

src/infrastructures/EngineConnector.ts Show resolved Hide resolved
@yamachu
Copy link
Member Author

yamachu commented Oct 30, 2021

うーん、このPR、Factoryから引っ張ってくるのと、依存を外部に移すのが混じってしまってるな…

@Hiroshiba
Copy link
Member

Hiroshiba commented Oct 31, 2021

コンフリクトしていそうなので解消お願いします。

@yamachu
Copy link
Member Author

yamachu commented Oct 31, 2021

Hiroshiba@1be4349
にてコンフリクト解消しました
コンフリクト部分は
Hiroshiba@8d012cd#diff-b86b438c7928773aac473007988ffb602afc8278b8e2226ce784442befb46b0dL434-R484
の箇所のみだったので反映いたしました

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants