HSP3:ガイドラインへの提案です。
以下の様に運用します。
文法
命令と関数の区別
- こんな感じでいかがでしょうか?
- いいんじゃないでしょうか。もうちょっと、大雑把でもいい気がしますが。
たとえば、HSPの自体に影響するものは、命令で、そうでないものは、
関数とか。
- HSPの基準を明確にするのも目的の内なので。皆従う必要はないという意味で「望ましい」としています。実際、特に最後の3つは好み次第。
最初に書いた趣旨は「HSP3の標準命令/関数の区別を明確にする」だけで、ユーザはそれに合わせるようにという方針でした。ただ、違う基準をもって区別している方もいるようです。まず、そちらも記した方が良いか、混乱の種にはならないか、ご意見お願いします。
- 「関数では引数の内容を変えない」などのベースのルールが明確にされてれば、参考例としてありだと思います。
- 「プログラムの状態を変える」とはどういう意味ですか?
- 全然、意味がわかかりません。
プラグイン・モジュールでの命令/関数の区別
- 関数は返された値(戻り値)を直接他のことに利用する可能性が高いもの(strlenとかstrfなど)が該当しますね、逆に値を返す必要がある(または返した方が便利など)が値が必ずしも必要ではないもの(dialogやオブジェクト作成命令など)は関数にすると必ず値を受け取るための変数が必要になるので関数にはしない方がいいと思います
- 「関数は返された値(戻り値)を直接他のことに利用する可能性が高いもの」という基準もありだと思います。ただ、HSPの標準関数ではさらに「引数の値が変わらない」という基準も入ってきますし、それだけは外さない方がいいと思います。また、「値を返す必要があるが値が必ずしも必要ではないもの」は「値を返すが重要ではない」ものとしてあります。何が重要じゃないのかが不明確なので、少し文言を修正しました。
- 最後の「返り値として重要で、返り値でなければならないもの」は微妙なところですね、ある特定の変数を操作して変化させる必要があるものは命令として引数で渡す、必ずしも変数を操作せず、返す値の型は固定というのが関数という感じでしょうか
- 関数の戻り値というのは結果としては変数に定数を代入しているのと変わりません。memsetやmemcpyなどの戻り値を受け取るための変数の一部だけに代入するには関数ではできません。
モジュール変数
モジュール変数が何かの説明はありますが、何をモジュール変数にすべきかが明示されてません。
globalの付け方
- 基本的にモジュールなどの中やモジュールの上でglobal定義はしないようにするといいと思います。(いくらモジュール内でglobal定義していなくてもその上でしていたら同じ事なので)というわけで、globalを付ける場合はすべてのモジュールの下でやること
- 配布する予定のあるモジュールやインクルードファイルでは使用しないようにすること
- できる限りオリジナルの名前(↓の名前空間とか)を使用すべき
- globalは利便性のためなので個人的に利用するプログラムなどでは非常に使い勝手がいいと思います、自分のみで使用するので問題も起きにくいですし起きてもすぐにわかり修正することも可能だと思います
- また、NULLなどの他の言語との互換性のためによく定義する定数などではglobalのほうがいいと思うので#ifndefなどでチェックしてから定義すれば問題はまず起きないと思います(値が常に同一であり絶対に違わないものだけ)
- モジュール側では「よく定義する定数」かどうかの判断は(ある分野ではよく定義するけど、それ以外では定義しないとか)難しいので、自作でないモジュールが現れる範囲内では使わないのがいいと思います。
- 基本的には標準で定義されているマクロ(HSP拡張マクロ)などはglobal付けていた方がいいですよね。また、NULLやFALSE/TRUEのように他の言語でよく利用されていて他の意味では通常使用しないような定義はすべて#ifndefなどでチェックしながらglobalで定義しても良いと思います。(global定義するものは既に定義済みでないかのチェックが必須になりますし定義されていた場合に他の用途に使用されていないことが前提にしないとスクリプト本文中で矛盾してしまいますね)
- 標準モノはそうですよね。NULL,FALSE/TRUEは、むしろ標準であるべきなのかも。
暗黙のglobal
名前空間
- 本来は名前空間を明確に記述するのが妥当なんですが結構面倒ですよね、プリプロセッサに通すと変数は自動的に名前空間を付けてくれますが、定義命令/関数などは微妙なところです
|