[過去ログ] + JavaScript の質問用スレッド vol.126 + [転載禁止]©2ch.net (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
542(4): 2015/11/03(火)20:33 ID:??? AAS
質問させてください。
特定時間にページ更新、カートをクリック
この機能だけ使えるスクリプトを作りたいのですが、どれから始めていいか分かりません。
お勧めの書籍がありましたら教えてください。
よろしくお願いします。
543: 2015/11/03(火)20:40 ID:??? AAS
>>542
>どれから始めていいか
まずはあなたのレベルを申告することから
でないとどこから始めるべきか他人にわかるわけがない
544(1): 2015/11/03(火)20:53 ID:??? AAS
jsなんてゴミから入ったら悪い癖がつくだけだ
やめとけ
545: 2015/11/03(火)20:53 ID:??? AAS
完全な素人です
>>544
ほかどんなものがお勧めでしょうか?
546: 2015/11/03(火)21:21 ID:??? AAS
>>541
コードを読ませること自体はいいことだし、その教育方針も妥当だと思うが、
既に読んでいることを新人に期待するのは無理がある。それがないから新人なのだから。
とはいえ、JavaScript界隈はコードを読んでいる方だと思うぞ。
お前らも結局読んで返事をしているみたいだし、他の連中もそんな感じだ。
これは一つにはJavaScriptの構造上、基本的にコードは晒されるというのがあって、
読めるという前提で文化が醸成されているからだと思う。
これは他言語にはない特徴であり、JavaScript界隈が活発な一つの要因だと思う。
他言語の場合は、読みたくても読めないことが大半だからね。
547(13): 2015/11/03(火)21:38 ID:??? AAS
>>539
書いた
外部リンク:jsfiddle.net
Math.minは確かに迷った結果のコードだが、ダメとする絶対的な理由が足りない
(他が比較演算子を使用するので統一感はないとは思うが)
処理順に関しては値の切り分けによって後述処理を都合よく処理する為だ
falsy, truly な例外処理を先にするかは状況によるし、ポリシー次第だと思う
(構造化プログラミング的にはこの手法はダメだが、出口を一つにするメリットがなかったので採用しなかった)
そこまで否定される理由はないと思ったが、あなたはどのような理由でダメだと思った?
>>541
省1
548(1): 2015/11/03(火)23:40 ID:??? AAS
>>547
おー書いたか。ご苦労様。ならばその労に報いよう。
はじめに俺はJavaScriptが専門ではないと断っておく。しかしここら辺はプログラミングで共通だからね。
一般的に、JavaScriptではコード自体のフットプリントが問題になることはまずない。
したがって、実用的には
A. 見やすいコード
B. 速いコード
のどちらかを採用することになる。逆にいえば、これ以外のコードは要らない。
ただしJavaScript特有として「イレギュラーに対する対処」を考慮する必要がある。(後述)
ここではコードの量に異常にこだわる奴が散見されるが、見やすいコードというのは
省6
549(1): 2015/11/03(火)23:41 ID:??? AAS
getFirstLine2はcharAtを使うのならこの実装で妥当だろう。
イレギュラー対策をdo/whileにしてstring.chaAtで引っかけるというのは若干トリッキーではあるが、
これが許可されるのならこれでいい。(少なくとも速度オーバーヘッドはない)
ただしJavaScriptだと一般的にはgetFirstLine1の方が速いはずなので、これが使われることはないだろう。
(C言語ならgetFirstLine2が最速)
さてgetFirstLine1だが、先述の通り、ここはB(速度)を目指さないといけない。(存在価値がない)
記述にもこの意識は見られ、Stringオブジェクト変換を減らしている。この辺はいい。
そこで処理順なのだが、速度を目指すのだから、よくある順にショートカットにして組むことが必要になる。
つまり、-1 && -1 の「例外」を最初に見るのではなく、
20,21とかの「通常」のケースを最初に処理しないといけない。
省13
550(1): 2015/11/03(火)23:41 ID:??? AAS
さてイレギュラー対策だが、多分(ここら辺は本職から聞くべきだが)
α. 安全重視、全箇所でチェック。
β 速度重視、最初にチェック、以降は「型」までは確定、値については保証無し。
のどちらかで組むのだと思われる。
ポリシーαで、どういう状態でも安全性を明示するために「最初に例外処理」のルールなら旧コードが妥当になるが、
実用的にこれはないように思われる。
普通の仕様としては、「イレギュラーなら例外、それ以外は正しく処理」であり、関数内の記述順まで規定される必要はない。
記述順を規定する=ソースコードを見てデバッグするということだが、その場合は普通は「例外を投げずに自分で処理しろ」となるからだ。
またJavaScriptの場合はgetFirstLine3のように「暗黙的なイレギュラー対策」が出来ることも多く、(確認していないが)
「明示的なイレギュラー対策を最初に行え」というルールだと色々無理が生じてしまう。
省12
551(2): 2015/11/03(火)23:45 ID:??? AAS
まあ漏れらベテランは、nullが返されて、
nullオブジェクトで関数を呼んだら、
そんな関数はありませんという実行時エラーを、
無数に経験しているからな。
用心深くもなるわな
>>542
Firefoxで、Selenium IDEで、
ボタンをクリックしたり、
ページをリロードしたり試してみれば?
JavaScriptもプログラミング素人には難しいよ
552: 2015/11/03(火)23:46 ID:??? AAS
gdgdはいいからはよコード書けよ
553: 2015/11/03(火)23:54 ID:??? AAS
getFirstLine3が最速だろ
実際のコード書いてないのがバレバレ
554(1): 2015/11/04(水)00:24 ID:??? AAS
>>547
ついで。もうコードは書かなくていいから。
細かいことを言うと、indexOf('\n')はLFのみのテキストの場合引っかからないので、最後まで見に行ってしまう。
結果、getFirstLine1はMac/UNIXの大規模テキストを食わされると極度に遅くなる。
とはいえ、良い対策は無い。
この危険性は 2/3 にはない。
だからまあ、普通は 3 を使っておけということになる。
555(1): 2015/11/04(水)00:30 ID:??? AAS
>>551
試してみたんですが、タイマーが機能せず、
同時実行無理なんですよね・・・あきらめまs
556: 2015/11/04(水)00:57 ID:??? AAS
>>551
本職か?
ならば俺の見解は550の通りだが、そちらの見解を聞きたい。
現実的には安全策を採って色々あるのだと思うし、
それ以前に各種ブラウザ対策でルールが埋まっている気もするが。
557(1): 547 2015/11/04(水)01:22 ID:pUq54Vxq(1/9) AAS
>>548-549
> さてgetFirstLine1だが、先述の通り、ここはB(速度)を目指さないといけない。(存在価値がない)
どんなコードでも催促のコードを書くことを目指すべきという考え方は好感が持てるものだが、正規表現エンジンの速度は最適化具合によって異なる
getFirstLine1 と getFirstLine3 のどちらが速いかは実装依存だろう
> そこで処理順なのだが、速度を目指すのだから、よくある順にショートカットにして組むことが必要になる。
その通りだが、「よくある順」を知っているのは質問者だけだ
私は getFirstLine1 の用途を想定できないのでそれは質問者に委ねることになる
具体的にはよくある文字列が「1行」「\rだけ含む」「\nだけ含む」「\r\nを含む」のどれなのかを想定できない
だから、速度重視としてはアルゴリズムか実装の最適化具合に応じて組むことになる
> 多分そちらの「構造化プログラミング」ってのはreturnを1個にしろという話だろうけど、そういうのは俺は気にしていない。
省8
558: 547 2015/11/04(水)01:32 ID:pUq54Vxq(2/9) AAS
>>550
> ただ、それ以前に、「どんな型でもちゃんと処理しろ」というのはやはり負担が大きく、どこかしらでバグるだろうから、
そんなことはない
どんな型でも安全に処理すべきだし、私のポリシーは「1: 安全、2: 速度」だ
ECMAScript は型が緩いといわれるが、それは内部的に型変換して処理しているからだ
ほとんどの演算子、関数は内部的に始めの処理でキャスト(型変換)している
従って、始めの処理で引数をキャストしておけば「どんな型でも適切に処理」することは難しくない
ここで回答する時には「例外処理ぐらいは自分でやってくれ」のスタンスで意識的に省略することがあるが、>>537の指摘は妥当なものだ
例えば、RegExp.prototype.exec は第一引数を ToString (String型に変換) するのでどんな型でも適切に処理できる
外部リンク[exec]:www.ecma-international.org
省12
559: 2015/11/04(水)01:47 ID:??? AAS
>>506的なのやりたいときこんな感じにしてたわ
for (var i=0,l=text.length,;i<l;i++) {
if (text[i]=="\r" || text[i]=="\n") { break; }
}
560(1): 547 2015/11/04(水)02:09 ID:pUq54Vxq(3/9) AAS
>>554
> 結果、getFirstLine1はMac/UNIXの大規模テキストを食わされると極度に遅くなる。
> とはいえ、良い対策は無い。
確かに2回走査するのは getFirstLine1 の弱点だ
対策としては string.indexOf('\n'); の後に string.slice(0, i1) する方法が考えられる
「\n がなく、\r がある巨大なテキスト」「\nも\rもない巨大なテキスト」には対応できてないので根本的な解決ではないが、UNIXなテキストには一応対応できる
外部リンク:jsfiddle.net
561(1): 2015/11/04(水)02:54 ID:??? AAS
> >>557
若干被るかもしれないが、とりあえず書いたから投稿しておく。
> どんなコードでも催促のコードを書くことを目指すべき
違う。常に何のためのコードなのかを考えろということ。
見た目のわかりやすさなのか、速度なのか。安全性ならそれはそれでいい。
> 正規表現エンジンの速度は最適化具合によって異なる
これはその通りだが、通常は軽い仕様の方が速い。(正規表現は色々出来る分遅い)
1つのindexOfとexecで両方が同一箇所でマッチする時、(今回なら\rの検索)
通常はindexOfの方が速い、というか、indexOfの方が遅くなる実装を作ることの方が難しい。
既に書いたが、ヒットしないケースでキャッシュに収まらないほどのテキストを食わされると、
省9
上下前次1-新書関写板覧索設栞歴
あと 441 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.017s