HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0912
木村コーディングについて教えてください14解決


木村

リンク

2010/9/12(Sun) 19:52:00|NO.34964


#define METHOD "set_flag_by_multi" #modfunc set_flag_by_multi var adress, var value, int type, local clause \ , local new_adress, local adress_length, local index ;―――――――――――――――――――――――――――――――――――――――― ; [set_flag_by_multi modvar, adress, value, type] ; ・adress先のフラグ要素をtype型、内容valueにする設定命令 ; adress : Adress型のアドレス表示 ; value : フラグ要素に定義する内容 ; type : フラグ要素の型 ;―――――――――――――――――――――――――――――――――――――――― set_flag_create thismod, adress output_adress_clause adress, clause, 0 if func_adress_length(adress) = 1 { index = func_flag_same_flag(thismod,clause) set_element_flg_clear 傘下フラグ.index, type switch value case VARSTR : set_element_flg_by_utf16 傘下フラグ.index, value : swbreak case VARDOUBLE : set_element_flg_by_double 傘下フラグ.index, value : swbreak case VARINT : set_element_flg_by_int 傘下フラグ.index, value : swbreak default : swbreak swend } else { output_adress_lower adress, new_adress index = func_flag_same_folder(thismod,clause) set_flag_by_multi 傘下集合.index, new_adress, value, type } return #undef METHOD

 ユーザー定義命令だらけなので概要を説明すると、第2引数adressは一種のファイル
アドレスで、要素数が1の場合はファイルを、2以上の場合はフォルダを探して更に深く
潜ります。
 問題はローカル変数のindexで、要素数1の場合は『アドレスの指定するファイルの座標』を、
2以上の場合は『アドレスが中継に利用しているフォルダの座標』を示している事です。
 本来なら別用途の変数を同一ローカル変数で扱うのは問題だとは思うのですが、使用領域が
if〜else構文で完全に並列隔離されており、更に用途も似通っているので敢えて同一ローカル
変数で処理しています。

 皆様はこのような場合、ローカル変数を1個増やして各用途毎にローカル変数を使われますか?
 それとも、上記のように変数を統一してローカル変数を1個省略しますか?
 教えて下されば幸いです。



 それと宜しければ、以下の質問にも答えてくださると嬉しいです。

Q2, マルチステートメント(命令間を:で区切り1行に複数命令を記述する事)をするか否か
Q3, if構文をマルチステートメントにするか否か
Q4, switch構文を利用するか否か
Q5, if構文を利用するか否か
Q6, 命令の引数間に半角空白を入れるか(=color a,bではなくcolor a, bと書くか)否か
Q7, 関数の引数間に半角空白を入れるか(=limit(a,b,c)ではなくlimit(a, b, c)と書くか)否か
Q8, ローカル変数を使うか否か
Q9, 一次元の配列変数を記述する際にa(b)ではなくa.bの表記法を使うか否か
Q10,1行の文字数を絶対に半角80文字以内に収めているか否か
Q11,各命令、各関数の行数を絶対に30行以内に収めているか否か
Q12,外部から要求されないであろうモジュール命令を必ずローカルにするか否か

 色々なコーディング規約を見てみるとswitchやifは使うなとか、引数間は空白を入れろとか、
80文字30行に収めろとかありますが、素人プログラミングだとどうしても全てを満足させる事が
できません。
 なので、皆様がどのようなコーディングをしているのかを教えてくださるとありがたいです。
 ちなみに、以下は私自身の回答です。

Q1是 Q2否 Q3是 Q4是 Q5是 Q6否 Q7是 Q8是 Q9是 Q10是 Q11否 Q12否



この記事に返信する


f3d

リンク

2010/9/12(Sun) 20:17:06|NO.34965

Q9, 一次元の配列変数を記述する際にa(b)ではなくa.bの表記法を使うか否か
これは否
HSP3で

print "HelloWorld"
と同じ感じ。



check

リンク

2010/9/12(Sun) 20:57:33|NO.34966

モジュール内でテンポラリ変数は共有して使うな。
そもそもHSPには一時変数という考え方がないからテンポラリ変数自体ないけどな。

Q2, 見易さによって変える。 普通はしない。
Q3, 1つの条件で複数の命令を実行したいときはそうする。
Q4, 特殊マクロというわけの分からないものかつ、遅くなるので利用しない。
Q5, よく分からん。 ifがないとプログラムはなりたたんだろ。
Q6, 入れる。
Q7, 入れる。
Q8, 使う。
Q9, a(b)とする。
Q10,HSPでは改行がプログラムの区切りになるため読みやすさ重視で勝手に改行ができないので否。
Q11,質問がよく分からん。
Q12,ローカルなモジュール命令ってなんぞ?



レノス

リンク

2010/9/12(Sun) 22:29:11|NO.34967

コメントで index の意味を記述しておけば、分けなくてもいいと思います。
分けたほうが無難ですが、範囲も小規模なので、混乱のもとにはならないかと。

Q2, 原則 否 見やすくなる場合やマクロの内部では使います。
Q3, 条件も処理も簡単な場合は、1行にまとめてしまうことがあります。
そのときでも {} を使いますが。
Q4, 是 ただし長くなりすぎないように気をつける
Q5, 是 必須
Q6, 是
Q7, 是
Q8, 是 頻繁に使う。意味的にローカル変数なのは必ずそうする。
Q9, a(b) 多次元配列の時こっちの方が見やすいので。
Q10, 否(無理) あまり長すぎるのは見にくくて良くないですが、
改行が不自由なので、常に守るのは難しいでしょうね。
Q11, 是 特定の行数には決めてないが、短くしたがる。
Q12, 「要求されないであろう」ではなく「要求されるはずがない」ものは非公開にする。
現状要求されてないけど、されることも考えられるものは公開しておく。

----
ローカル命令ってこういうのですよね?

// モジュール modname からしか(原則)アクセス出来ない #deffunc sttm@modname ... // あるいは #define sttm ___sttm #deffunc ___sttm ...



木村

リンク

2010/9/12(Sun) 23:11:57|NO.34968

 まずは回答してくださったf3d様とcheck様、そしてレノス様に感謝します。

>>f3d様、check様
 やはりQ9(配列変数の書き方)はa(b)と書くようですね。私はShiftキーが面倒でついついa.b形式にしてしまいますが、これからはa(b)形式にシフトして行きたいと思います。ありがとうございます。

>>check様
 Q10とQ11は関数を一画面に収めるべきか否かと言う意味で置かせていただきました。こちらの解像度環境(1366×768)だとHSP付属のスクリプトエディタで俯瞰できる最大行数が30行なのであのような質問となりました。横80文字は一般的なエディタは80行前後が目安だと聞いたからです。
 しかしながら、確かに意味の通じにくい質問でした。申し訳ございません。

>>check様、レノス様
 ローカル命令とはこのような物をイメージしています。

#modfunc set_flag_by_multi var adress, var value, int type, local clause \ , local new_adress, local adress_length, local index set_flag_create thismod, adress output_adress_clause adress, clause, 0 if func_adress_length(adress) = 1 { index = func_flag_same_flag(thismod,clause) set_element_flg_clear 傘下フラグ.index, type switch type case VARSTR : set_element_flg_by_utf16 傘下フラグ.index, value : swbreak case VARDOUBLE : set_element_flg_by_double 傘下フラグ.index, value : swbreak case VARINT : set_element_flg_by_int 傘下フラグ.index, value : swbreak default : swbreak swend } else { output_adress_lower adress, new_adress index = func_flag_same_folder(thismod,clause) set_flag_by_multi 傘下集合.index, new_adress, value, type } return #modfunc set_flag_by_utf16 var adress, var unicode set_flag_by_multi thismod, adress, unicode, VARSTR return #modfunc set_flag_by_sjis var adress, str sjis, local unicode newmod unicode, m_unicode, FLAGSET_NAME_LENGTH set_unicode_by_sjis unicode, sjis set_flag_by_multi thismod, adress, unicode, VARSTR return #modfunc set_flag_by_double var adress, double value, local double_value double_value = value set_flag_by_multi thismod, adress, double_value, VARDOUBLE return #modfunc set_flag_by_int var adress, int value, local int_value int_value = value set_flag_by_multi thismod, adress, int_value, VARINT return
 概要を説明すると、switchの部分を除いて下の4命令は全て同じ事をしています。その為、一番上のset_flag_by_multi命令に実務を投げる事で4命令が重複したソースを持たないようにしています。(4命令が各々に処理すると50行近くソースが膨れる)
 しかし、あくまでも一番上のmultiは内部を整頓するための道具であり、外向きに解放するつもりの命令ではありません。その為、この類の『整頓の為に作った内向きの命令』をローカル命令と申し上げた次第です。分かり辛い表現で申し訳ありませんでした。



木村

リンク

2010/9/12(Sun) 23:13:27|NO.34969

 後、手書きで回答して頂くにはいささか質問の数が多いと思いましたのでツールを
作りました。ツールの指示に従ってボタンを押し、最終的に表示される回答一覧をこの
スレットにコピペしてください。
http://hspdev-wiki.net/?plugin=attach&pcmd=open&file=%A5%B3%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0%BC%C1%CC%E4%28ver2%29.exe&refer=%B4%CB%CB%FD%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8%B0%DC%C5%BE%C0%E8%2F%A5%B3%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0%A4%CB%A4%C4%A4%A4%A4%C6%A4%CE%BC%C1%CC%E4

 尚、上記のツールが置かれているのは以下のサイト(HSP開発Wiki)です。上記のURLで
落とせないようでしたら、こちらのページの添付ファイル(コーディング質問(ver2).exe)から
落として下さい。
http://hspdev-wiki.net/?%B4%CB%CB%FD%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8%B0%DC%C5%BE%C0%E8%2F%A5%B3%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0%A4%CB%A4%C4%A4%A4%A4%C6%A4%CE%BC%C1%CC%E4



Mimura

リンク

2010/9/13(Mon) 01:05:17|NO.34973

私もやってみました。

☆回答一覧☆
Q1(同一ローカル変数): どちらとも
Q2(マルチステートメント): どちらとも
Q3(if構文をマルチ): 大方は是
Q4(switchの利用): 大方は否
Q5(ifの利用): 断じて是
Q6(命令半角空白): 大方は是
Q7(関数半角空白): 大方は是
Q8(ローカル変数の利用): 大方は是
Q9(配列の書き方): 大方は否
Q10(80文字制限): どちらとも
Q11(30行制限): どちらとも
Q12(内部命令の隠蔽): どちらとも
Q13(接頭辞の利用): 大方は是
Q14(ゲッター関数): 大方は是
Q15(セッター命令): 大方は是
Q16(出力命令の利用): 大方は否
Q17(gotoの利用): どちらとも
Q18(gosubの利用): どちらとも
Q19(独自の暗号化): どちらとも
Q20(Unicodeの利用度): どちらとも

どうも関数の命令規則は、WIN32API や C# の関数みたいな付け方をするようです。

1ファイル内の行数や、
1行あたりの文字数は特に気にしていないのですが、やってみようかなぁ。と思い「どちらとも」

独自でラッピングした命令を使うこともあることはありますが、
HSP上でラッピングしたものを使いますと、あんまり速度が芳しく無い物で。
リアルタイム系じゃない物や、コンパイラ言語系では使うことが多いです。

HSP でも Java や C# のように、 private / public などで、きめ細かく公開範囲を設定したり、
ローカル変数を用いて、必要がなくなったらメモリ開放。などやりたいところではありますが、
そんなに細かく出来ないけれども、逆にそれが 気軽に扱えてメリットのような。

何か参考の一つにでもなれば幸いです。



木村

リンク

2010/9/13(Mon) 21:34:33|NO.34985

>>Mimura様
 回答していただきありがとうございます。

 『WIN32APIやC#の関数みたいな』命名規則と言う事は
EternalFourthBlizzard とか
eternalFourthBlizzard 等と言った『_(アンダーライン)』を用いない記述法と言う事でしょうか。

 私は一番最初の言語がHSPだったせいか、単語間を大文字で区切るのがどうも怖くて、つい
eternal_fourth_blizard のようなマクロ式の記述で変数や命令名を書いてしまいます。

 ヘルプの命令一覧を見ていても
★頭文字を大文字にして_を使わない流儀(Easy3D For HSP3 や Artlet2D の類)、
★接頭辞との区切りに_を用いる流儀(hspcmp や hspdxfix の類)、
★接尾辞との区切りに_を用いる流儀(llmod3 や hpi_exprogctrl.hpi の類)、
★全く_を使わず頭文字も大文字にしない流儀(hspda や hspinet の類)、
等々単語の区切り方だけでも様々です。(setを頭に付けるか尻に付けるか、プラグイン固有の
接頭辞を使っているかとかの癖も様々)

 別に共通指針を作りたいわけでもないのですが、HSPユーザーの命名法と言うものにも興味が
湧いてきました。


 後、出力命令(=noteget命令やcnvstow命令のように第1引数に値を返す命令)は作らない
と言う事ですが、モジュール型の変数を返したい場合はどのようにされているのでしょうか。
教えてくだされば幸いです。(毎回毎回出力用の命令を作るのは骨が折れるので)



テック

リンク

2010/9/14(Tue) 20:06:18|NO.34997

コーディング質問(ver2).exeをダウンロードしてやってみました。

☆回答一覧☆
Q1(同一ローカル変数): 大方は是
Q2(マルチステートメント): 断じて否
Q3(if構文をマルチ): 断じて是
Q4(switchの利用): 大方は是
Q5(ifの利用): 大方は是

Q6(命令半角空白): 断じて是
Q7(関数半角空白): 断じて是
Q8(ローカル変数の利用): 断じて是
Q9(配列の書き方): どちらとも
Q10(80文字制限): 大方は否

Q11(30行制限): 大方は否
Q12(内部命令の隠蔽): どちらとも
Q13(接頭辞の利用): 断じて否
Q14(ゲッター関数): 断じて是
Q15(セッター命令): 断じて是

Q16(出力命令の利用): どちらとも
Q17(gotoの利用): 断じて否
Q18(gosubの利用): 断じて否
Q19(独自の暗号化): どちらとも
Q20(Unicodeの利用度): どちらとも

補足といたしまして、
Q13の接頭辞ですが、関数名ではなく、
主に変数名に使われることが多いと思います。
C/C++やJavaなどでは、ハンガリー記法と呼ばれています。
しかし、最近では使用されなくなりつつあります。

文字 意味 使用例
b または f:論理型 bDutyFlag
by :バイナリ型 byCount
n または i:integerなどの整数型 nPower
l :long整数 lDate
ui :符号なし整数 uiColor
dw :double word型 dwSize

Q14・Q15のセッター・ゲッターですが、
C/C++やJavaでは、関数名や命令名規則には、
動詞+名詞の形にするというのがあります。
で単語の区切りごとに頭文字を大文字にすることを、
私も最初は知らなかったのですが、
キャメルケースというそうです。
まあHSPでは、大文字・小文字を区別しないのですが。


SetValueやGetValue、MoveCar

あと、これは質問にはないのですが、
傘下フラグ.indexなどように、
変数名等に、日本語(全角)を使用するのは、
あまりお勧めしません。

まあコーディング規約というのは、個人で開発する場合には、
あまり気にしませんが、大きいプロジェクトでは、
大抵ありますので、そういう場合には、
そのプロジェクトのコーディング規約に従ったほうがいいと思います。



check

リンク

2010/9/14(Tue) 20:13:07|NO.34998

関数名や変数名をキャメルケースで書くのはWindowsAPIを使ってプログラミングすると、
WindowsAPIの関数名がすべてキャメルケースで書かれているので、それにあわせるためか。
test_get_valueとかのようにアンダーラインをいちいち引くのはめんどくさいんでな。



Mimura

リンク

2010/9/16(Thu) 13:50:35|NO.35008

遅くなりました。
Win32API のような命令規則というのは、
単純に、CharLower や ScreenToClient のような、
動作を命令にした命令規則のようなやつです。

特に深い意味はないです。

また、出力命令を造らないということで回答してしまったようですが、
これは別途出力させる独自命令を作るということと解釈しておりました。

noteget というような命令全般ということであれば、作成します。
ですが、簡単なやつであれば、関数 (#defcfunc) をつかったやつも使ったりします。

ではでは。



gagreag

リンク

2010/9/16(Thu) 15:56:30|NO.35009

きむらぁ
最近お前HSP開発wiki使ってるようだが
お前HSP開発wikiの使い方まちがってねーか?
HSPTV用あっぷろーだじゃねぇんだよ!!!!!!!!!!!!

何がHSPTV質問ツールだよ ふっざけんじゃねぇ


あ?反対意見として
サンプルスクリプトになりうるだ?
ならねぇよ!!!!!!

面倒なやつは答えなきゃいいんだよ カスが。
アンケートに答えるだけにツールなんかに頼ってんじゃねぇよ!!!



木村

リンク

2010/9/17(Fri) 17:44:46|NO.35016

 皆様回答ありがとうざいます。そして、返答が遅くなって済みません。

>>gagreag様
 ご指摘ありがとうございます。確かにHSP開発Wikiをアップローダ同然に使っていました、
申し訳ありません。開発Wiki側のページも削除して頂いて、本当に返す言葉がありません。

 重ね重ね御手間を取らせて申し訳ありません。ただ、御無礼ついでにお伺いしたいのですが、
ページ自体は削除されたようなのですがアップロードしたツールはまだ生きているようです。
 どうすれば添付ファイルも削除できるかご指導くだされば幸いです。


>>テック様
 回答ありがとうございます。ハンガリー記法やキャメルケースと色々勉強になりました。

>変数名等に日本語(全角)を使用するのは、あまりお勧めしません
 やはりあまり良い方法ではないですよね。私も止めた方が良いとは理解しているのですが、
モジュール変数(メンバー変数や属性と言った方が良いのか?)を区別して、モジュール変数への
操作を行う部分を分かりやすくする為に敢えて使っていました。
 半角英数字で明確にモジュール変数を他の名称と区別できれば楽なのですが、単純に大文字に

するとマクロと被りますし、頭に_(アンダーライン)を付けた形もインクルード済みか否かを判別する
マクロで良く使われる用法なのであまり良くは無いと思いますので、当面はモジュール変数の
名称を半角英数字に置換するだけにしたいと思います。
 参考になりました。ありがとうございます。


>>check様
 二回も返答してくださりありがとうございます。
 確かにWin32APIの関数にはあまり_を見かけません。(定数には見かけますが)これからは
キャメルケースでの記法も行えるように精進したいと思います。ありがとうございました。


>>Mimura様
 重ねて返答して頂きありがとうございます。
 やはりnoteget命令のような引数に直に値を返す命令を使われるようですね。
 あまり引数を変更するような命令は良くないと聞いていましたが、HSPの仕様上モジュール
型の値を返すにはどうしても関数型ではなく命令型を使わざるをえませんでした。
 悪い癖ではないかと思っていた部分の問題が解消されました。ありがとうございました。



木村

リンク

2010/9/17(Fri) 17:46:05|NO.35017

 皆様の返答を眺めてみるに、混乱を誘発しない程度であればローカル変数を共有する事も
あると分かりました。今後は原則共有は避けつつも、今回のような場合には柔軟に対応して
いきたいと思います。
 最後に改めて、回答を返して下さったf3d様、check様、レノス様、Mimura様、テック様、
gagreag様に感謝いたします。
 皆様が返答して下さらなければ、今まで疑問に思っていたコーディングのグレーゾーンの
処理に毎回毎回頭を使わなければなりませんでした。

 本来の質問は以上で解決なのですが、他の皆様のコーディングの流儀も教えていただければ、
勉学の励みになります。ですので、参考までに前述の質問ツールは残しておきます。
 奇特な方がいらっしゃるのなら、回答一覧をこのスレにコピペしてくださると質問者としては
嬉しい限りです。

 尚、件の質問用ツールは正規のアップローダに移転しました。アドレスは以下ですので以降は
こちらを利用してください。
http://ux.getuploader.com/darkness_runasUPLOADER/download/161/%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%B3%AA%E5%95%8F%28ver2%29.exe



GENKI

リンク

2010/9/17(Fri) 21:42:16|NO.35019

> どうすれば添付ファイルも削除できるかご指導くだされば幸いです。

詳しくはHSP開発Wiki「雑談」を参照。
ファイル削除は管理者パスワードが必要です。
雑談ページで管理人さんに削除したい旨を伝えてみてください。



ONION software Copyright 1997-2023(c) All rights reserved.