JavaScript の質問用スレッド vol.123 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 73c8-oPzN)
垢版 |
2017/04/03(月) 00:31:25.68ID:82yaJsi70
JavaScript を自ら学ぶ人のための質問スレッドです。
>>2-6のテンプレを読んだ上で質問してください。次スレは>>950>>2のテンプレ案(本スレで改善案があれば考慮)を元に立ててください

■質問を書く上で
(1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。
(2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。
  (ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など)
(3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。
(4) 常に自発的に調べる心構えを持ってください。
  具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。
  わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。
(5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。
(6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。
  ※必ず「問題の事象が再現されること」を確認してください。
   必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。
(7) サンプルコードに HTML が含まれる場合は http://validator.w3.org/ で [Check] してみてください。
(8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2の質問テンプレートを活用してみてください。
(9) ライブラリ関連の質問は禁止です。関連スレにあるライブラリ質問スレで質問して下さい。
(10) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。
※前スレ
JavaScript の質問用スレッド vol.122
http://echo.2ch.net/test/read.cgi/tech/1472426483/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2017/05/13(土) 23:23:24.73ID:qMDptb/r0
「配列arrの中の、start番目以降の要素の中で、prop==xxxに当てはまる最初の要素のインデックス」を
求めるならこんな感じにそのまま書けばいいのよ
var i = arr.findIndex((v, idx) idx>=start && v.prop==xxx);
2017/05/13(土) 23:33:21.05ID:BFgjnkHK0
>>159
ああそれはその通りだね。
(俺はあの書き方はそもそもしないから慣れてない)
ただ俺はそれだとstart以前も走査するのが気に入らないから、
やっぱりwhileで回すけど。
2017/05/13(土) 23:36:49.07ID:f5G7qLua0
>>157

var i = arr.slice(start).findIndex(function(v){return v.prop==xxx;})+start;

最近の書き方だとこうだろ?
var i = arr.slice(start).findIndex(v => v.prop == xxx)+start;

んで、lodash使えばこうなる。
var i = _.findIndex(arr, {prop: xxx}, start);
2017/05/13(土) 23:38:27.63ID:f5G7qLua0
>>157 >>160

> なのか?しかし無駄が多いし余計に見にくいだろ。
> (俺はあの書き方はそもそもしないから慣れてない)


コードの話をしようぜ?

俺は見にくいというのは、コードの話じゃなくて
お前の話になってる。

お前が見にくいっていうのなら、単にお前が未熟ってだけ。
コードの話をしている時に、人の話をしてはいけない
2017/05/13(土) 23:41:00.33ID:f5G7qLua0
>>159

こうだな

var i = arr.findIndex((v, idx) => idx >= start && v.prop == xxx);
var i = start; while (i<arr.length && arr[i].prop != xxx) i++;
var i = _.findIndex(arr, {prop: xxx}, start);

一行につなげて比較してみよう
2017/05/13(土) 23:46:38.05ID:Iih4R+8da
カンマ演算子の使いどころは、一つのStatementしか記述を許されてない箇所にある
(while文の条件式、アロー関数の省略記法、三項演算子など)
省略記法が大好きな人ほど好む傾向があるかも知れない
2017/05/13(土) 23:48:01.73ID:qMDptb/r0
>>158
いやまぁもちろんこんな無名関数をそのまま書いたりしないけどね
上と抽象度違っちゃってるし、いつもはちゃんと名付けするよ(面倒だから手抜きしましたごめんなさい)
「一般的か?」って言われたら、JavaScriptでは一般的ではないでしょう
だいたいみんなif文使うし、宣言型なんて見ない見ない
ただまぁこうやって引数にしちゃえばキャッシュ出来るよという参考までに
あとは自分で選べばいいさ
2017/05/13(土) 23:49:06.10ID:BFgjnkHK0
>>161
sliceした方がいいかどうかは場合によるのだけど、
一般的にはsliceせずに回す>>159だと思うぞ。

それはおいといて、そもそも findIndexに開始地点を指示出来ないのが謎なんだが。
だからlodashが必要になるわけで。
とはいえlodashは普及しないよ。
確かに短く書けるけど直感的ではないし、わざわざ学ぶほどの価値もない。

とにかくその件については俺はwhileの一択だ。
速いし分かりやすいし。
君がそう思わないのも君の自由。
ただいずれにしても、おれはカンマ演算子について聞きたいのであって、
157以降は俺の興味以外だから降りるよ。
2017/05/13(土) 23:55:22.89ID:BFgjnkHK0
>>165
> JavaScriptでは一般的ではないでしょう
ちなみにこれを他言語では一般的にやってるのか?それは何言語?
別に糾弾しようってわけではなくて、ちょっと見てみたい。

ちなみに抽象度については俺も思ったが、それ以前に、
1つのことをやる物を2つに分解して配置したくないので、
俺は「名前付き関数」にして呼ぶって事もしない。if文で書く。
ただしこれはCでは関数内関数が使えないからそういう文化なのであって、
関数内関数が使える言語なら別文化もありだとは思う。
2017/05/13(土) 23:56:04.26ID:qMDptb/r0
>>157
もちろん、それでいいと思うよ
そこら辺考えだすとそうするしかない
折衷案としてはこんな感じでwhileの部分を関数化する感じかな

var searchPropIdx = function(arr, tgt, start){
var j=0, len=arr.length;
while (j<len && arr[j].prop!=tgt) j++;
return j;
};
var i = searchPropIdx(arr,xxx,start);

これでも何してるかは関数名が教えてくれるから宣言的といえるのではないでしょうか
2017/05/13(土) 23:56:59.84ID:f5G7qLua0
>>166
> 分かりやすいし

だからコードの話をしている時に
自分の話をするなって
2017/05/13(土) 23:59:09.17ID:f5G7qLua0
>>168
自分で関数作るぐらいならlodashの方がいいな。
いきなりsearchPropIdxとか書かれても
コード読まないと何をしているのかわからない。

lodashのような有名ライブラリであれば
有名なライブラリを知っているならば使い方わかるし
たとえ知らなくても、誰かが解説してくれてれる
2017/05/14(日) 00:02:48.77ID:zJfJO46R0
>>170
lodashが使える環境ならもちろん使う
ただまぁ標準ライブラリではないから今回のケースでは考えませんでした
2017/05/14(日) 00:09:32.47ID:Rp58SwPv0
>>168
まあ、俺も必要な場合はそのように関数化してくくり出すけどね。

メリットは抽象度が上げられて依存関係を切れる(隠蔽出来る)ことだが、
ここら辺は要するにオブジェクト指向のメリットであり、
そもそもオブジェクト指向は巨大なコードを何とかする手法だから、
ここでlodashを布教している奴が理解することはないというのは、
これまでさんざん見てきたとおり。

俺はlodashが使える環境でも使わないね。whileで書く。
ただここら辺は各人が好きなようにすればいいだけの話だね。
2017/05/14(日) 00:18:55.77ID:UzoQivKq0
>>172
自分のやり方を押し付けるな

俺はコードの話をしてるだけ
2017/05/14(日) 00:45:18.37ID:zJfJO46R0
>>167
「値は引数を関数に適用させて作るもの」ってのはラムダ計算の基本的な考え方だから、大抵の関数型言語ならそうじゃない?
そもそも例えばHaskellなんかは今回でいうget_tagを同一スコープ内で何回実行したところで、
引数が同じなら計算結果は最初のものを常に使い回すしね

別に好きに書けばいいんだよ
ただ最初に宣言的って言ってたのが何か勘違いしてそうで引っかかっただけで
2017/05/14(日) 01:10:19.27ID:Rp58SwPv0
>>174
> ただ最初に宣言的って言ってたのが何か勘違いしてそうで引っかかっただけで
これについてはそちらの指摘通り、俺は勘違いしていると思う。
俺は関数型言語を使ってはいないからね。
これは、俺の用語に誤用がある可能性を考慮しつつ話をしてもらうしかない。

> そもそも例えばHaskellなんかは今回でいうget_tagを同一スコープ内で何回実行したところで、
> 引数が同じなら計算結果は最初のものを常に使い回すしね
Haskellってインミュータブルだったっけ?忘れたけど、
確かにインミュータブルだったらこれで終わりだね。
つべこべ言わずに何回も書いても関係ない事になる。
しかもHaskellの場合は遅延評価だから事前に書いても大してオーバーヘッドもない。
まあこの辺が便利なのかもね。

> 大抵の関数型言語ならそうじゃない?
そうか。了解した。
2017/05/14(日) 01:12:21.75ID:Rp58SwPv0
すまん、

× インミュータブル
○ 再代入禁止

だね。
2017/05/14(日) 02:45:59.49ID:wDkNkjbA0
>>157
>> 短絡評価も、後ろの式が実行されるかどうか、分かりにくいので、
>> 使わない方がよいと言われる
> いやそれはCの世界では嘘だ。あっちは短絡評価ありきで組む

後ろの式に、副作用がある場合、バグ含みになるから、危険。
それで、Pythonでは、以下のように書けるようになってる
1 < f() < 10

MISRA-C 2004 のコーディング規則を参照
2017/05/14(日) 05:32:19.86ID:QAEk2mhn0
>>172
俺はお前の見方
2017/05/14(日) 07:47:04.55ID:wDkNkjbA0
<tr>
<td><%= name %></td>
<td><%= gender %></td>
<td><%= job %></td>
</tr>

lodash.js (underscore.js)には、template があるから、
jQueryですべての要素を作らなくても、HTMLファイルに値を埋め込むだけでよい
2017/05/14(日) 08:05:39.42ID:Rp58SwPv0
>>177
つかMISRAを持ち出すのなら番号まで指定してくれ。
あれは膨大な数があるんだから。
つっても、見てもそうだとしか書いてないとは思うが。

> 1 < f() < 10
Pythonがそう書けるのはいいとは思うが、そもそもCプログラマで
> 1 < f() && f() < 10
をやる奴はいないんだよ。これは常識だから。
次に、関数型が「参照透過(キリッ」とかやっているのも
Cだと最初からほぼ参照透過なんだよ。
クロージャはないし、グローバルもほぼ使わないんだから。
(通常はポインタを与えないと非参照透過にならない。
ポインタについては明示的に見えるから、
クロージャのある言語のように「参照透過」を気にする必要がない)
だからそこら辺の文化は明らかに違う。

実際、whileループなんて短絡評価ありきでないと組めないし、
俺が出した例なんてマジで頻出だぞ。

で、それを「俺は配列の長さなんて管理したくない。
該当するインデックスが欲しいだけだ」と言うのなら、
コード例も既に出したように、それが明示的には見えないコードにすればいいだけだろ。
ただ俺はあれで効率が上がるとは思えないがね。

根本的に違うのは、
while (i<arr.length && arr[i].prop != xxx) i++;
はCに於いてはarrに対して副作用を持ち得ないんだよ。(通常はvolatileでないから)
ところがJavaScriptではゲッタやプロキシがあるし常用されるから、これだけでは言い切れない。
だからそもそも「副作用」に対する感覚が全然違うんだよ。
2017/05/14(日) 08:55:23.90ID:wDkNkjbA0
MISRA-C 2004 ルール12.4

論理演算子 && または || の右側のオペランドには、副作用があってはならない。
volatile もダメ
2017/05/14(日) 09:13:34.23ID:Rp58SwPv0
>>181
それは

× 短絡評価が駄目
○ 短絡評価内で副作用が駄目

だよ。重ねていうが、以下認識は間違いだ。

> 短絡評価も、後ろの式が実行されるかどうか、分かりにくいので、
> 使わない方がよいと言われる (>>148)

結局の所、12.4も「短絡評価されるから」という大前提でしょ。
Cの世界はそうだよ。
短絡評価自体が駄目なんてのは、聞いたことがない。
2017/05/14(日) 11:13:06.81ID:Rp58SwPv0
というか今更気づいたが、カンマ演算子ってほとんどの言語ではないんだな。
むしろある方が異端のようだ。

ある:C/C++, JavaScript, Perl
ない:Java(ただしfor文内のみ可), C#, Ruby, てか多分他全部

JavaScriptの場合は匿名関数をその場で定義して使っても構わないから、
文が書けないからカンマ演算子という時は大抵この方法でも回避出来る。
といっても余計に見にくくなるが。
例: (function(){ /*何かの動作*/ })()
2017/05/14(日) 12:11:34.87ID:pHcsRThma
普通にif-elseifで書けばいいのに、カンマ演算子にこだわりすぎて暴走しとるな
2017/05/14(日) 12:37:42.55ID:j3QiJPk20
構文なんだから人間様解るように記述すればいいだけ
ただのオナニー
2017/05/14(日) 12:43:51.10ID:UzoQivKq0
関数型風に書けよw
カンマ演算子なんて関数型風でも
一旦変数に入れるだけの話だろ
2017/05/14(日) 12:49:06.75ID:UzoQivKq0
そういや短絡評価は殆どの言語にあるんだな。
2017/05/14(日) 13:27:08.87ID:pHcsRThma
そもそも関数型風のメリットは論理と計算の分離であって、どっちがいいとかじゃないし
三項演算子を使ってcaseAの場合aが返ってくるなら、そうでない場合は同等の型のbが返ってくるのが基本
三項演算子をネストさせるってことはそもそも論理と計算が分離されてない
それを気にしないなら別に好きにすればいいんだよ
見やすい見にくいみたいな主観に任せればいい
2017/05/14(日) 13:30:55.25ID:UzoQivKq0
関数型風にすればconstを使えるようになる。
変数に入れた値が変わらないから、コードを把握しやすくなるし
バグも減るのがメリット
2017/05/14(日) 20:32:09.27ID:QAEk2mhn0
全部プロトタイプベースで書けばいいと言うのと同じくらい無意味な綺麗事
つうかconstは長いし普通の人にとっては読みにくい
意地っ張りの価値観の押しつけをする気が無いのなら
手元では好きに書いていいが挙げるときは置換くらいしてくれ
それが最低限のマナー
2017/05/14(日) 20:57:23.20ID:pZ8yqHc90
> つうかconstは長いし普通の人にとっては読みにくい

英語読めない人?
2017/05/14(日) 21:01:57.87ID:pHcsRThma
新しいものが一般的でないのなんて当たり前なんだよなぁ
いかにそこから普及させれるかだ
先人の叡智を無駄にしてはいけない
2017/05/14(日) 21:11:34.04ID:HLo7v2s80
> つうかconstは長いし普通の人にとっては読みにくい

constが長かったらdocument.body.innerHTMLとかもはや解読不能だろ
2017/05/14(日) 22:56:24.87ID:LykvO83v0
むしろconstは多用したほうが保守性は上がるでしょ。今時var宣言使っちゃだめよ
2017/05/15(月) 07:30:07.09ID:vbGagq9z0
constでキレイにインデントできたら最高なんだけどなぁ
2017/05/15(月) 10:39:17.61ID:ChsP7NlFM
仮にconstが消えてもletになるだけで
varにはならん
2017/05/15(月) 11:43:14.43ID:vXJw7fGsF
全部constにするんなら、宣言要らない関数型altJS使えばいいじゃん
2017/05/15(月) 12:37:45.42ID:Nyf5aX+Ca
自分で言語決めれる開発なんてほとんどないし
2017/05/15(月) 14:42:16.22ID:k1YI7zCW0
ES6なら末尾呼び出し最適化が働くのでforは再帰で書ける
なのてletは不用 constだけで良い インデントも揃う
2017/05/15(月) 18:12:27.51ID:5bRXjaUX0
>>198
いやいや、フルconstの自由があるならAltJSくらい余裕でしょ
つうかconstの実際価値があるっていうのじゃなくて
単にconst、constって書いて自己満足、安心「感」を得たいだけになってるでしょ
2017/05/15(月) 18:39:27.33ID:Z3hdp57V0
マ板っぽい話になってきたな
2017/05/15(月) 23:41:39.28ID:rGWruaOX0
ヤフー知恵袋のjavascriptマスターがドヤ顔で公開してるカレンダーのコード読むと、
グローバル変数だらけで非常に見辛いし、グローバル汚染されたコードだった
悪い例として参考になったな。
たまに、参考になる質問と回答が、知恵袋とか2chにあるが、
玉石混交だな、
2017/05/16(火) 00:06:49.67ID:ufkb+DTs0
どれのことかね? JavaScriptマイスターの俺が
修正してあげよう
2017/05/16(火) 00:25:50.14ID:FdkA0PdW0
>>203
これです。
グローバル変数だらけで、グローバル汚染されているし、
クロージャ使って、モジュールにしろよって思ってしまいます。
非常に読みづらし、解読するのが骨が折れると思われます。
ttp://miwa850125.php.xdomain.jp/programming/content/00001.html
2017/05/16(火) 00:40:25.65ID:ufkb+DTs0
>>204
あぁ、うんゴミだね。これは修正の価値すらないや。
関数の定義だけ聞いて自分で実装したほうが早そうだ
2017/05/16(火) 00:47:14.10ID:ufkb+DTs0
× 関数の定義だけ聞いて
○ カレンダーの仕様だけ聞いて
2017/05/16(火) 07:16:46.00ID:bc694O2E0
>>204
> グローバル変数だらけで、グローバル汚染されているし、
> クロージャ使って、モジュールにしろよって思ってしまいます。
まあこれも問題なんだけど、それ以上に構成が酷い。というか平べったすぎ。
こいつそもそもサブルーチンすら使ってなくね?

> 非常に読みづらし、解読するのが骨が折れると思われます。
ちなみにこれは違う。平べったいコードは読むのは面倒だが難しくはない。
ただしまともに読む気にならないが。見た瞬間ゴミだと分かるレベルだし。

俺も>>206に同意だな。
そしてみんなそうらしいぞ。まあそりゃそうだが。
http://miwa850125.php.xdomain.jp/notice/content/00012.html

ただ、素人が組んだ500行前後のコードってこうなりがちではあるんだがね。
(というか多分300-500行程度で組めるはず)
2017/05/16(火) 10:23:51.85ID:jyI5CijS0
今時githubで管理してない時点でお察しだな。zipでダウンロードしてーとかしんどすぎる。
2017/05/16(火) 19:48:46.02ID:FdkA0PdW0
ちなみに、このカレンダーの作者は
javascript歴17年の自称30〜39歳の女性です。
知恵袋で
「javascrit初心者相手にfor文もわからんのかww」
っておらついてます。

多分、プログラム書いて「動いたwww スゲー 自分は天才やんwww」
とかのレベルで止まってしまったと思われる。

勉強しないと、いつまでも初心者レベルから抜け出せいってことだせない教訓になった
2017/05/16(火) 20:45:52.90ID:bc694O2E0
>>209
ついでに言っておくと、
初心者は「コードが読めないのは汚いからだ」と主張しがちだが、実際はそうじゃない。
初心者が技術的に至らないからというケースがほとんどだ。
とはいえ、実際に駄目なコードは散見されるし、初心者がこれらを区別するのは無理だ。
だからこういう場所で聞いてみるのは一つのやり方だとは思う。
そしておそらくこれが目的だろうからこういう回答になる。

実際に高度に組織化されたコードは、初心者には全く読めないと思う。
逆に、こういった平べったいコード、上から順に一通り動いて終わりですね、
みたいなコードの方が初心者にも読める。
そして「上達するのは『書く』時ではなくて『減らす』時だ」という主張をする奴もいて、
実際「書く」よりも「減らす」方が頭を使うのも事実なので、
君がこのコードに相応しい初心者で上達を望んでいる場合、
このコードを減らして同じ動作を得ること、つまりリファクタリングを薦める。
それをやれば、このコードのどこが駄目なのか具体的に分かるし、いい練習になる。
(はっきり言って全部駄目なんだけどさ)

グローバルが〜ってのは実は大した問題じゃない。
(function(){
})()
でくくってやればすぐ解決するだけの話でしょ。
初心者はそういう文法的なところにばかりこだわるから上達しない。
最も重要なのは構造/構成なんだよ。
2017/05/16(火) 20:46:28.78ID:bc694O2E0
なお、
> 「javascrit初心者相手にfor文もわからんのかww」
> っておらついてます。
これについては初心者の方が悪い。
for文なんてどの言語でも基本中の基本だし、
そこら辺は最低限押さえてから質問しないと駄目だ。
初心者だからって何でも許されると思っているのはただの傲慢だ。死ねでいい。

> 勉強しないと、いつまでも初心者レベルから抜け出せいってことだせない教訓になった
これも違う。
というか多分、ソフトウェア産業は未だに「上達への王道」を開発出来ていない。
つまり、今現在の方法で「勉強」すれば上達するわけではないということ。

ここら辺は学校教育の物理や数学で
人類が数千年掛けて築き上げた叡智をわずか数年でインストールしてしまうのとは次元が違う。
ソフトウェアは高々100年程度の歴史しかないし、教育方法もよく分かってないんだよ。
だから繰り返すが、今現在溢れている本を仮に全部読んでみても、達人にはなれないよ。
関数型とか言っているのも、実はまだどうすべきか分かってない証拠でもあるしね。
数学や物理は、学校でやってるのが完全に王道だと確定してる。あれとは違うんだよ。
そして、いくら「勉強」しても、駄目な奴は駄目なまま。
ただそれをどうやって改善すればいいのか分かってないんだ。
だからセンター試験みたいな物を作ることが出来ない。
そしてその人が「勉強してない」って事にも(直接的には)ならない。
(実際は勉強してない確率が90%以上だし、
実際書くなり本読むなりすれば『大半の人は』自然と上達するのも事実だけどね)
2017/05/16(火) 20:50:54.00ID:28fcRnPx0
> ソフトウェア産業

プログラミングはナチュラルに趣味グラマーがハブられることが多くて
いっぱいかなしい
2017/05/16(火) 22:27:17.83ID:UlJ2aQ8H0
それは思い込み、実際は逆だよ
趣味でやってる人達は自由、好きにやればいいだけの優位者
職業としてやってる人達の方にハンデがあるんだから尊重してもらわないと困る
2017/05/16(火) 22:45:21.09ID:bc694O2E0
>>212
前それ別スレで話題になっていたが、
個人的には「天然」の方が「養殖」よりも上質だと思っているよ。
ただ毎日毎日コードを眺めているのと、せいぜい月に2〜3日では場数が違うわけでさ。
とはいえ場数をこなせば上達するわけでもないというのは事実なのだが、
個人的には奇妙だとも思っている。
普通は場数をこなせば次第に上達するものではあるからね。

いずれにしても、「勉強しよう」と思うのは良いことだけど、
いわゆる「お勉強」で単純に上達するというものでもないんだ。まだ今は。


さてもう一度見直して気づいた。コードを書き慣れていない奴の特徴は、
・無駄な改行が多い
・空行が多い
これは多分共通だし、初心者でも見て分かるはず。

つかね、10,000行とかのソースだとただでさえスクロールしまくりなので、
1画面に出来るだけ沢山詰め込みたいという欲求が発生し、
空行とか無駄改行は全くやらなくなってくるんだよ。ウザイから。
これは割と共通の癖だと思う。
Pythonerが括弧を嫌うのも閉じ括弧だけの行がウザイからだし。
詰めて書いても今時色分けされるから見間違えることもないし。
(ただもちろん中には例外もいて、どんだけスクロールしても問題ないらしい奴もいる)

見た目、せいぜい50行程度しかまともに書けない奴が、
頑張って2,000行書きました、えっへん!みたいなコードだね。
ただ、これって誰しもが通る道だから、これ自体が悪いとは思わないけど。

なおコード自体は昔の定義の「コピペプログラマ」がこんな感じ。
実は結構いたりすると思うよ。
2017/05/16(火) 22:52:40.26ID:bc694O2E0
なんつうかね、

長文に全く慣れてない奴ってこんな風に、いちいち改行したりするでしょ。

それって長文に慣れてるとものすごくウザイでしょ。

余計に読みにくいし。(多分斜め読み出来なくなるから)


だけどコードに慣れてない奴って、やけに改行や空行入れたがるんだよ。

それは、改行をウザイと思うほどコードを読んだことがないってこと。

つまり、初心者だって事だね。
2017/05/16(火) 23:30:21.74ID:28fcRnPx0
「初心者プログラマーにありがちなこと」ってスレタイでプログラマースレに立てるべき内容になってきてるぞ
すぐ「プログラマー」の話にズレていくのは職業プログラマーの悪い癖
2017/05/17(水) 00:00:46.55ID:kS+euEi/0
まあその通りだが、あのコードから技術的にってのは無いからね。

ただ、一般的にあの規模のコードだと、割と平べったくなりがちなのも事実。
これ自体は不思議ではないんだよ。
ちょうど一つのクラスとして切り出すか?というサイズだから。
で、おそらくお互いが相手をヘボだと見なし、
無駄に争っていたのだろうというのも想像に難くない。

先に言ったように、あのコードをさらに大規模化する場合、
functionで囲ってクラスに変える。
そうするとグローバル→インスタンス変数になるわけで、これ自体は問題ない。
だから「グローバルが〜」ってのも初心者にありがちな間違った指摘で、
あの規模のコードならあれで良いんだよ。

結局、文法的なことしか見えない程度のくせに
コードの善し悪しなんて議論するからアレな事になる。
あのコードは不思議なコードではないんだ。
良いコードでもないし、上手いコードでもないけど。
でも誰しもが通る道だよ。
2017/05/17(水) 00:11:36.09ID:r9YOxAGU0
「技術的ってか、この辺はセンスの問題だな」ってさ、仕事しててもよく言われる

装置のログの解析とかもそうだけど
なんで1時間とかそこらでログの解析できんだ?
なんで、そんなにコーティング早いんだ?
センスって言われると、習得しずらいんだよな。

まるで職人技だよな
2017/05/17(水) 00:43:36.95ID:aIm9uZNt0
センス関係ない
「とりあえず動くコード」で満足するか、より良い品質にこだわるかの考え方の違いだ
2017/05/17(水) 00:45:04.71ID:kS+euEi/0
>>218
> 仕事しててもよく言われる
つまりセンスが無い方の人なんですね乙

ただまあ「センス」って言っているのは教えようがないからだよ。
それは俺はまだ教育技術が未発達だからだと思っている。
数学とかのセンスって、
「ところでこれをどうやって思いつくんだ?」
であって、明らかに東大とかよりもはるか上のレベルでしょ。
今のプログラミングが要求している「センス」って、もっと断然低いところでしかない。
それでIDEやインテリセンスで効率が上がる(キリッとか間抜けなこといっているわけでさ。
「なるほど確かにこの構造にすれば恐ろしく簡単に実装出来るが、
ところでどうやってこれを思いついたんだ?」では全然無いよね。
フェルマーの最終定理(x^n+y^n=z^n)とか、問題の意味は分かるがどうしろと?だろ。
あれを「センス」と言うべきなんだよ本来は。

> なんで1時間とかそこらでログの解析できんだ?
当たりを付けているからだよ。
映画やアニメでハッカーがでてきたら「ほらビンゴだ!」ってよくやってるだろ。

> なんで、そんなにコーティング早いんだ?
コーディングに速さは必要ない。
最終的にデバッグ終了までの時間が勝負で、実際デバッグの方が遙かに時間かかるでしょ。

ただまあ、あのコードはいずれにしても不思議なコードではないから、
見た瞬間、ああ、このレベルですね、ってのは順当に分かるようになるはずだし、
そこまでの上達にはセンスは必要ないはずだから、
君が今やるべき事は、とにかく何でもいいから書くことだよ。
2017/05/17(水) 00:56:37.57ID:kS+euEi/0
>>219
これはあるね。よく言われる「職人気質」って奴だよ。

プログラミングは自己完結して己の美学を目指せる奴しか上達しない。
これは一般には「職人気質」と言われる。
おそらく職人も同様にこの性格じゃないと上達しないため、
結果的に生き残っている職人はこのタイプが多くなるのだと思う。

だからそうじゃない奴は、向いてないから止めた方がいい。


あのコードは、まさに
> 「とりあえず動くコード」で満足する
タイプが書くコードなんだよ。だから悪いと言うほど悪いコードでもない。
なんつーか、手堅く動くだろうが、動くだけのコードですねってとこ。
しかしカレンダーなんて今更仕様変更はないし、保守性なんてどうでもいい。
自分で書き直すのもかったるいし、俺的には渡されたら使うかは迷うところだね。
2017/05/17(水) 01:17:15.04ID:kS+euEi/0
ところでMapだが、

> for (var [key, value] of myMap.entries()) {
> console.log(key + " = " + value);
> }
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map
これって分割代入で、chrome49〜ですってオチあり?
Mapはchrome38からになっているし、entries()もそうなのだけど。
2017/05/17(水) 01:34:13.73ID:y0sg8W2t0
>>222
babelを使えば古いブラウザでも動くのではないか?
2017/05/17(水) 01:44:59.69ID:kS+euEi/0
いや無駄に対応バージョン上げたくないんだ。
やっぱそうなんだよな?
今回はkeys()で1箇所書き直せばいいだけだからそうするよ。サンクス。
2017/05/17(水) 07:29:14.42ID:L5+4x8hM0
Chromeのバージョンを気にする、しかも10も前とか普通じゃないな
2017/05/18(木) 23:57:01.79ID:QkFLciDt0
オレがいままで作ったjavascriptのアプリケーション

・画像うuplodar (2012年から公開してる今年で5年目)
→javascript,html5,mysql,phpで作成

・単語帳(非公開、TOECI勉強用に使った自分専用の単語帳)
→複数のtxtに書いたjsonデータの文字列を読みんで表にして表示する

今のとこ、とりあえず動くレベル→自分で読みづらいとこと修正と改善
を延々とやってる。
ってか、仕事と英語の勉強が忙しいから、javascript勉強してる暇があまりない

購入して積ん読になってる、日経ソフトウェアのjavascript特集を読みたいがいまいち暇がない
2017/05/19(金) 00:58:06.06ID:+ix37Tej0
むしろchromeの古いバージョン使う方法ってあるの?ネットが使えない環境とか?
2017/05/19(金) 21:19:25.76ID:PWVc802d0
ReduxはReact専用じゃないというけど、React以外で使いやすいのはどのフレームワークかな?
2017/05/20(土) 00:04:22.78ID:T9Vl1Go7M
>>227
サブの動作確認用スマホとか古いままだけどなぁ
2017/05/20(土) 04:04:11.15ID:Q+8+XcCz0
>>228
別になんでも使えるんじゃないか。
storeをsubscribeするだけなんだし。
2017/05/20(土) 08:41:00.64ID:ZTnw5ZtI0
その「subscribeするだけ」の具体的なやりかたを知らないんで、そういうライブラリや資料が
そろっていたりして使いやすいものがあるか探してる。
Reactならreact-redux入れてその通りにやればよかったんだけど。
>>230は何のフレームワークを使ってどんなふうにやったことがあるの?
2017/05/20(土) 11:00:51.79ID:Vxiesmpy0
phinaとかpixiとかenchantとか色々あるけど結局ゲーム製作用ライブラリとしてはどれがいいの?
2017/05/20(土) 11:43:08.14ID:2QFlCqZ1d
それらはゲームにも使えるというだけの汎用描画フレームワークだから
本当に描画部分から音周りまで完璧に揃っているフレームワークは
例えばノベル専用みたいな汎用性の無いものしかない。
ガチで作りたいならやっぱりUnity等のゲームエンジンからの書き出ししかない。
2017/05/20(土) 17:11:04.67ID:Q+8+XcCz0
>>231
redux はコード量が少ないから直接見ることをすすめる。
subscribeはまんまそのままのメソッド生えてる。
2017/05/20(土) 17:16:56.10ID:Q+8+XcCz0
>>231
ごめんreactからしか使ったことはないけどchrome-extension作るのに使ってて、react以外からdispatch投げたり、イベント処理する必要があるからよく使う。
なんつーかただのjsonの塊だよね結局。typescriptから使ってるから問題ないけど、素のjsから使うとなるとあの巨大なjsonの塊をよくいじれるよなーと思う。
2017/05/20(土) 22:18:55.23ID:ZTnw5ZtI0
なるほど、ありがとう
2017/05/21(日) 16:49:46.53ID:BQHBWsZS0
要素数が1か1以上かわからない(0ではない)配列をsortするとき、特に要素数を
数えて条件分岐しなくてもそのままsort関数適用させてもいいですかね?
何かパフォーマンス的に問題出たりしますか?
2017/05/21(日) 18:45:14.37ID:Qcnnq4EA0
elmはいいぞー
2017/05/21(日) 21:42:26.20ID:feqlkx7U0
>>237
問題は出ますん
2017/05/21(日) 22:26:43.45ID:8o9mWviY0
>>237
要素数が0であっても配列であれば何の問題もない
パフォーマンスは問題が出てから解決すればいい

大きな影響ないことなのに、ブラウザごとに挙動が違う問題を
いちいち考えるのは時間の無駄
2017/05/21(日) 22:55:20.58ID:fcCJNl/UM
そのレベルで効率化ガーは本当に間抜けな話だとおもうよ
何も変わらんさ考えるだけ時間の無駄でただのオナニー行為

最近流行のHTML5でのパーティクル表現なんて毎秒数百オブジェクト新たに生成して一定時間生存させ消していく
その管理の配列がどんどんインデックス追加でオブジェクトがあるかないかのif判定を毎秒数万、数十万とかやってるプログラムとかよく見る
馬鹿げた設計だとおもってもそれで普通に動いてるから笑える
今はそんな時代だよ
2017/05/21(日) 23:52:11.78ID:BQHBWsZS0
皆さんありがとうございます
上司が割と効率にうるさいので怒られるのが嫌で気になった次第です
問題ないみたいなのでこのままいきます
2017/05/22(月) 00:04:03.94ID:FRIGOkgNM
>>242
効率化というより、ソースのわかりやすさ、管理のしやすさを考えればいいよ
判定文を入れることで皆がわかりやすくなるなら入れれば良いし
今度どう使われるかはっきりわからないモジュールならエラー処理をしっかりいれるとか
2017/05/22(月) 00:15:50.44ID:KxRThp41d
これで効率云々言われるなら、保守の効率引き合いに出して揉めたほうが良いと思う。
2017/05/22(月) 01:16:10.94ID:jp4wTISD0
つかその上司もここで怒る事はないだろ。
新人なりに思いついたから聞いてみただけだろ。

てか上司に聞けよ。
2017/05/22(月) 11:36:54.13ID:0kkPVdOqd
そこまで気にすることはないけど、理由がここまで言われてるのとは違う
実装見れば分かるけどsort関数は要素数などによってアルゴリズムが使い分けられてて、汎用的なソート関数としてはこれ以上ないくらい最適化されている。
エンジン側の主張は、それ以上を求めるなら専門的なアルゴリズムのものを自作しろとのこと。
2017/05/22(月) 20:24:53.55ID:jp4wTISD0
ちげーだろ。つか>>246はもうちょっと状況を把握しろ。

よく上司に「無駄なことをするな」と言われる新人がいて、
そいつがふと「要素数1のArrayに対してsortは無駄じゃね?」と考えた。
だからここで聞いてみた。結果はご覧の通り。

新人だから何が無駄で何が無駄ではないのか分かってないんだよ。
それは仕方ない。だから新人なりに考えてみた、これは正しい。

しかしこのレベルの話は上司に聞いたほうがいい。
俺たちに聞いて回答が食い違ったとき、誰が正しいか新人君には分からないだろ?
現在のところキチガイは現れておらず、常識的な回答が揃っているが、これは偶々。
ここにはマジで頭おかしい奴はいる。
最低限そいつらを見分ける能力がないと、ここは使えない。いわゆる嘘を嘘と(ry

だったらとりあえず一応は信頼できる(ことになっている)上司に聞いたほうがいい。
そして、どうしてもその上司の判定に納得できなければ、ここで出来るだけ詳しく晒せ。
そしたら俺たちがどっちの頭がおかしいか判定してやるから。

なお質問は、「arr.sort() は if (arr.length>1) arr.sort() にすべきか?」だろ。
ここには日本語が不自由な奴もいる。
誤解無く伝えたいのなら、コードで書くのも手だよ。
2017/05/22(月) 21:36:29.80ID:6t8os15O0
> よく上司に「無駄なことをするな」と言われる新人がいて、

普通は無駄な作業って意味だよ。
人的コスト=時間がかからない方法を選択しろといういこと

問題になってない部分のパフォーマンスの良し悪しに
悩むっていうのも無駄な作業の一つ

ただ新人の場合は、特に勉強しないと無駄な作業が減らせない。
無駄な作業を減らすにも、時間がかかる。

だから上級者によって「無駄なことをしないコード」が
必ずしも時間がからない方法とは限らない。

どれだけ勉強すればいいかは本人次第なのだから、他人にそれがわかるわけがない。
だからこういう場では上級者(質問に答える人)にとって無駄がないコードを提示するしかない

質問に答える人は、もし前提となる知識が特殊なものや大きければ、○○を知っているならば、
この方法を使うのが一番無駄がない(=時間がかからない)と答えるのが良いだろう。
2017/05/22(月) 22:57:40.88ID:jp4wTISD0
>>248
> と答えるのが良いだろう
じゃあまずお前がやれよキチガイ
2017/05/22(月) 23:11:11.24ID:XhRKlUOx0
javascriptスレかと思ったら社畜プログラマーが新人指導についてご高説を垂れていた
2017/05/22(月) 23:29:33.71ID:vGCFGEpe0
おまいらそんなすぐ煽るなや
2017/05/22(月) 23:30:12.68ID:FRIGOkgNM
>>248
だからさー、配列要素1の時にif文かますのとそのままソート掛けるのとどっちが効率いいかおまえにわかるのか?ん?
環境の実装しだいだろそんなもん
どちらにせよ何も気にするレベルじゃないという回答以外に何があるっているんだ?ん?
2017/05/22(月) 23:37:56.72ID:GGalZ9mO0
変なこと聞いてスレを荒れたような結果にしてしまってすみません
2017/05/22(月) 23:40:11.09ID:6t8os15O0
>>249
> じゃあまずお前がやれよキチガイ

>>240ですでに答えているが?
2017/05/22(月) 23:40:15.75ID:XhRKlUOx0
>>253
プログラミングで計算効率について考えるのは全然変なことじゃないぞ
むしろ基本
2017/05/22(月) 23:41:49.08ID:6t8os15O0
>>252
速度については誤差以上の差は出ない。

だから開発効率(作業コストが低い方)を選ぶべき
つまり読むべきコードが少ない方がいい
2017/05/22(月) 23:49:15.91ID:XhRKlUOx0
「パフォーマンスの問題」について質問したのにいつの間にかに「作業コスト」の問題に変わっている

これが動的型付けって奴だな
2017/05/22(月) 23:55:39.55ID:CEFnqLB20
Array.prototype.sortに判定させた方が当然に速い
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況