-
Notifications
You must be signed in to change notification settings - Fork 64
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
module import() behavior where the module only supports specific environments #515
Comments
この問題に関しては二種類あると思います。
今回は話をシンプルにするために 1. だけ考えます( 2. に関しても考えたほうが良さそうですが、たぶん別 issue ) 全体的に使えなくなる場合、インポートの意味すら無いため
な使い方が出来ると良いと思いました。なお例外を投げる方をデフォルトにしているのは、例外をデフォルトにしても壊れるプラグインが少ないかな?という個人的な感想によるものです。 |
let s:Job = vital#vital#import("System.Job") " 例外を投げる
let s:Job = vital#vital#import_with_no_availability_check("System.Job") " 例外を投げない (後者の関数名が長く冗長なのは意図的です) 現状、ConcurrentProcessのようにis_available()があるモジュールは以下です。
|
モジュールに.is_available()があれば自動的にimport()でそれ呼んで、falseなら例外投げるの良さそう |
長く冗長な関数名に一票! |
自分も import() 時の挙動としては @lambdalisue さんと @ujihisa さんの挙げた |
うーん.... これは好みかもしれないですが、import 時に例外を投げるのはともかく、引数増やしてコントロールしたり別名つくってまでやるのは好きじゃないですね... 個人的には is_available とかのほうがまだよい。全体のモジュールが使えないのか、特定のメソッドだけ使えないのかもコントロールできるし。(ここでは全体がダメな時と一部がダメなときとの一貫性も考えるという意) という意味で例外投げるのも厳しい気持ち。たとえば今後job関連の機能が追加されたり挙動が変更されるとしてメソッドが増えたり一部のメソッドが変わったりする場合、(neovim or vim8) & has_patch(xxx) となり、それで全体のimport自体を例外投げるようにするか?と言われたら絶対Noだと思う。 あと、
というのはまぁ確かにメリットではあるとは思うんですが、チェックしたところで結局動かないのは変わらないので、例外メッセージをわかりやすくする程度のメリットしかないんですよね。 vital 以外のビルトイン関数の仕様変更などは結局バージョンなどプラギン開発者がチェックしてるので、それと同じ感じで開発者がある程度やれるしコントローラブルだと嬉しい。 一番好みなのは理想案ではないですが、ドキュメントにしっかり条件をかいてあればそれが一番うれしい。モジュール全体としてのrequirementsはこうで、このメソッドはこういう条件があって...など. |
throwしない用の施工をするよりはtry-catchすればいい……というのはDRY原則に反するかなーと思います……:dog: |
想定ケースの違いですかね。僕は
の二種があると思って居ます。はやぶささんが仰る通り、例外に関しては 1. の対応しか出来ない上に 2. に対して別解を用意する必要があり一貫性がありません。 ただ、僕が想定しているケースとして「とりあえずそれっぽい名前があるからインポートして使っている」程度の認識を想定して居ます。この場合、インポート時に例外が発生すれば比較的早い段階で使えないことが分かるので、なんだかわからないけどエラーが出てプラグインが動かない」って状況を避けれるかなと思っています。 あと try-catch に関しては懐疑的です。引数や関数名であれば機械的に変換出来ますが try-catch だと厳しいです(そもそも後方互換はあくまでも利便性の為であり、推奨はエラーを出す方なので) |
コードをベースに話をしたほうが良いかなと思います. 1. import が例外を投げる時try
let s:Job = vital#some_plugin#import('System.Job')
catch
endtry
" 処理を分けるところ
if exists('s:Job')
" job があるとき〜
else
" ないとき…
endif 2. import が例外を投げない時let s:Job = vital#some_plugin#import('System.Job')
if s:Job.is_available()
" job があるとき〜
else
" ないとき…
endif この2つを比較してみると,確かに
僕も
こういう暗黙の挙動はデメリットしか感じないんですが,どう良いんでしょう? |
try
let s:Job = vital#some_plugin#import('System.Job')
function! foo(...)
" あるとき〜
endfunction
catch
function! foo(...)
" ないとき…
endfunction
endtry みたいに関数切り分けるとかはありかもですが,プラグインの処理によってはこういう実装は厳しそうな気も |
確かに投げる時と投げない時でエラーをハンドリングしなきゃいけないことに変わりはないのであまり変わらなそうですね。
これは撤回で、 |
昨日の話し合いとして、頑なに例外を推していたのは自分だけだったのですが
の三点から余力を残すために例外を採用しないでチェックで対応するという形で同意しました。 また、ここで言われている is_availabe() による真偽のテストではなく vital#plugin_name#health_check('module name') にて最低でも以下の情報を含む辞書を返す形で同意が取れています(たぶん
上記に加え、一部利用できない関数などがあれば追加フィールドとしてモジュール作者に依存する また vital#plugin_name#health_check() を実行した場合は上記辞書を子要素に持ち、(プラグインが依存する)各モジュール名をキーとする辞書を返すことで、プラグインの全依存関係が一度で取得できる。 各位上記に認識の相違があれば突っ込みお願いします |
#513 (comment) から派生。
要約
特定環境でのみ動くモジュールを import() した時、vital のモジュール全般においてどのような挙動にするべきかを話し合いたいです。
今出ている案は以下の通りです。
本文
#513 のモジュールの様に Vim 8 か NeoVim でしか動かないモジュールの場合、
サポートされない環境で import() した時に
Vim 8 or NeoVim is required
みたいな例外を投げたい場合もあるかと思いました。しかし ujihisa さん曰く、ConcurrentProcess ではそのようになっていません(ユーザに is_available() でチェックしてもらう API になっている)。
インターフェースが統一されてるといいかと思ったので、vital ではどのようにすべきかを相談したいです。
The text was updated successfully, but these errors were encountered: