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のビルダースタイルについて再考する #908

Open
3 tasks done
qryxip opened this issue Dec 27, 2024 · 2 comments
Open
3 tasks done

Comments

@qryxip
Copy link
Member

qryxip commented Dec 27, 2024

内容

Rust APIのJava APIでは現在ビルダースタイルを採用しており、systhesis系とttsおよびOnnxruntime::load_oncesynthesizer.operate(required_params).optional_param(optional_param).exec()という形のAPIになっています。

var wav = synthesizer.tts(text, styleId).interrogativeUpspeak(false).execute();
let ort = Onnxruntime::load_once()
    .filename("./path/to/libvoicevox_onnxruntime.so")
    .exec()
    .await?;

これに対し、次の懸念があります。

tts()でTTSせず、そのあとのexecで実行されるのが違和感あります。
.ttsが返す値がすでにwavだとも読めるので、読んでる時に誤解しやすいコードになってるかも。

#907 (comment)

とりあえずの緩和として、"exec"の代わりに"perform"とすることを提案します。

 let wav = synth
     .tts("こんにちは", AMAAMA_ZUNDAMON)
     .enable_interrogative_upspeak(false)
-    .exec()
+    .perform()
     .await?;

これでJava APIおよびRust APIを公開してみて、わかりにくいという声が出なければこのissueを閉じる感じでよいと思ってます。

Pros 良くなる点

Cons 悪くなる点

実現方法

VOICEVOXのバージョン

OSの種類/ディストリ/バージョン

  • Windows
  • macOS
  • Linux

その他

qryxip added a commit that referenced this issue Dec 27, 2024
api-design.mdでの方針に従い、Rust APIの表層から
`{Initialize,Synthesis,Tts}Options`を消してビルダースタイルにする。

> ```md
> * オプショナルな引数は、キーワード引数がある言語であればキーワード引数で、ビルダースタイルが一般的な言語であればビルダースタイルで表現すべきです。
> ```

懸念として #908 があるが、このPRではビルダーの締めは`exec`という名前のま
まにする。
@qryxip
Copy link
Member Author

qryxip commented Dec 27, 2024

#910

なんで.tts(..).option(..).exec()がfootgunではないと私が思ったのかというと、多分無意識に#[muse_use]の存在を前提に置いていた。

#909 のようなことを防ぐためにJava APIでも#[use_use]的なものを付けたいけど、残念ながらJavaのアノテーションにはそういうやつが無さそう…

@Hiroshiba
Copy link
Member

Hiroshiba commented Dec 27, 2024

無難な方に倒すと、.tts()がビルダーを返すことがわかるように.tts_task().configure_tts()などに改名するのが良いと思います!
ただJavaやRustで一般的なのであれば、.tts()でTTSされない形でも全然飲めると思います。

まあでも @qryxip さんが書いてくださった #909 のようなミスはかなり起こりやすいだろうなと思います。
Rustでは防げるならありだけど、まあ一般的に考えると流石に駄目かなーと。

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

No branches or pull requests

2 participants