はてなキーワード: 引数とは
どこで必要になるのか
仕組みが複雑になってるだけ
いつか使うかもで必要ないもの作るのはやめとけって何かの原則みたいなのにもなかったか?
テストでしか使わないならテストのツールやフレームワークが側でどうにかすればいいこと
言語によってはモジュールやコンポーネントをモックすることで密結合になってるモジュールを差し替えできる
どころかまるでない
例えばReactではコンポーネントの引数として内部で使うコンポーネントを渡している
これで十分で不満に思ったことはない
変更の必要なければ渡さなくてよくてその場合は規定のクラスやコンポーネントが使われるだけだ
変な仕組みがないということは初見にも優しい
最初は2つだったんだが、要件が増えていく時に徐々に増えていってめんどくさくて引数に新しいのを追加するだけにしてたらしいんだよね
それじゃおかしいだろっていって*argsとか**kwargsを使ったほうがマシって話
アスペか?3つで書いたのは単に便宜上であり、実際は可能性のある入力の個数は複数通りある。すべての通りに対応するために引数をその個数に合わせるより*argsか**kwargsにしたほうが効率が良い。
全部まとめちゃってそもそも中身をみないと何が来てるのかわからないのは、全くの素人がシグネチャだけみたら簡潔に見えるかもしれないけど
実際には可読性かなり下がってる
他の人が指摘してるように
クラスにするというのもそのとおり
粗結合性から見るとアンチパターンだが、コードの見やすさは上がる。
#改善前 def honya1(a,b,c,d,e,f,g,h,i,j,k,l,m,n): (処理) #改善後 def honya2(**kwargs): (処理)
追記: 文脈がわかってないようなので書く。これは、どこかの計算で使われた集合を複数個(a,b,c,d,e,f,g,...)引っ張ってきて直積にする算術。最初は2つだったので良かったが、徐々に必要な直積が増えていき、その分だけ引数を定義していた。しかも任意個なのでNoneを与える部分もあった。*argsか**kwargsを使えばもっと簡単にかけるはず。
そこまでシビアな速度は求められてなくわかりやすさで比べた場合に
Array.from({ length: 5 }, (_, i) => i);
Array.from({ length: 5 }).map((_, i) => i);
Array.from(Array(5)).map((_, i) => i);
Array.from(Array(5), (_, i) => i);
Array(5).fill().map((_,i) => i);
[...Array(5)].map((_, i) => i);
Array.from
派 Array(n).fill
派[...Array(n)]
派昔の慣習に倣ってコメントを丁寧に書く人がいまだに居るけれど
以前のコードをコメントアウトしているようなソースは論外として
例えばメソッド・関数の頭にそれが何をする関数なのかを書いている人が多いけれど
メソッド名や引数名、戻り値の型をキッチリ付けておけば分からないことなんて無い
それ以上の複雑な処理をするなら機能分解するべきだし名前を付けにくい処理の場合はそもそもの設計がおかしい
昔は便利なIDEが無かったので変数や関数の名前に長い名前を付けると実装が大変で
仕方なくx1だとかval2だとかを使って実装してたのでコメントに書いておくようなこともあったけれど
Copilotを使える時代にコメントを書く必要なんて皆無だし
仮に意味が分からないコードがあってもCopilotに聞けばいいのでやっぱりコメントは必要ない
コメントがあった方が良い場合は「この実装はこのアルゴリズムに基づいて実装している」とURLのリンクを貼ったり
「この規則があるのでこういう実装をしている」とRFCを貼ったりするとかはあるけれど
それもほとんど変数名だとかで解決できるし、あっても1行で終わるレベル
そういう実装全体の設計に関するような話はReadmeに書けば良いのでソースコード内のコメントとしては必要無い
「それでも無いよりはいいでしょ?」みたいに言う人いるが逆に問題になることも多い
コメント内容と実装が違う場合にどっちが正解なのかが分からなくなったり
ソースコードの修正に対してコメントが修正されていなくて後々で揉めたりする
当然ながらコメント部分にはLintが効かないので(ChatGPT使えば作れそうな気もするが)
チェック内容も増えるし良いことがほとんどない
ヤバいJTCとかは「各行にコメントを書いて下さい」とか言ってきて正気の沙汰じゃ無い
まぁそういう案件が来たらChatGPTに丸投げするとは思うけれど下手すると「Copilot禁止」とかも言い出しそうだな
書いたところで誰も読まないのにアホすぎる
競プロと機械学習系のクソコード・クソジャークっぷりが取り立たされてるけど、クソコード・クソジャークっぷりは何も競プロerと機械学習erの専売特許ではない。
To run a batch file, you must start the command interpreter; set lpApplicationName to cmd.exe and set lpCommandLine to the following arguments: /c plus the name of the batch file.
バッチ ファイルを実行するには、コマンド インタープリターを起動する必要があります。 lpApplicationName を cmd.exe に設定し、 lpCommandLine を /c にバッチ ファイルの名前を加えた引数に設定します。
lpApplicationNameにバッチファイルのパスを設定するとCreateProcessは暗黙的にcmd.exeを起動しバッチを実行します
https://www.docswell.com/s/hoxo-m_inc/Z4Q8NL-2024-05-06-203800#p11
出力が先に来ることが分からないって言ってるけどプログラム書くとき殆どの言語においては出力が先に来ると思うんだけどそれもわからないんだろうか
public String test(String args){
return args;
}
大抵戻り値(出力)が先で引数(入力)が来て処理が来ると思うんだけど違う?
プログラムを書くときって出力の要件を元にして処理と入力が決まると思うんだけど違う?
シーケンスとか書くと確かに入力が元に来るんだけどプログラムの当初設計をするときは出力が先で出力を得るための入力と処理が決まる物だと思うんだ
入力を決めて処理と出力を考えてたら考慮漏れ発生して手戻り発生しない?
補完がやりづらいからっていうのはわかるけど、そんなんFROM句先にかけよで終わると思うので
いろんなアプリケーションのメンテ(バグ取りとか細かい機能追加とか)を何度か経験してきた。
主にテキストファイルとかCSVファイルとかExcelファイルとかを入出力するものばかりだったんだが、その大半がファイルの拡張子をグローバル変数化していた。
こんな感じ
const TxtFileExt = ".txt"; const CsvFileExt = ".csv"; const ExelFileExt = ".xlsx";
outFileName = 〇〇 + ×× + "ABCDEFG" + TxtFileExt;
みたいな指定をしなきゃならない。
あと、プログラム言語の標準的なメソッドのあらゆる引数も全部変数で定義されてて、そのまま渡すのは禁止、みたいな規約になってる。
たとえば引数が三種類(true、false(未指定時のデフォルト値)、任意の数値(ただし当該プログラムでは0、10、25以外指定不可))しかないやつはこんな感じ。
const 〇〇ParamTrue = true; const 〇〇ParamFalse = false; const 〇〇ParamIntMin = 0; const 〇〇ParamIntMid = 10; const 〇〇ParamIntMax = 25;
const charCodeSJIS = "Shift_JIS"; const charCodeUtf8 = "UTF-8";
以前関わった改修内容に「××の処理は開始時と終了時にそれぞれUTF-8(BOMなし)形式でログを出力する」みたいなのがあって、普通に文字コード指定する部分に「UTF-8」で直に書いたら、規約に従ってないからとコードレビューで指摘されて差し戻されたんだけど、そもそもこういう規約って何の意味があるの?