- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
933 :デフォルトの名無しさん[sage]:2016/06/11(土) 12:08:32.61 ID:NAulAg4n - >>932
http://echo.2ch.net/test/read.cgi/tech/1463663267/768 って意味がわかんないんだけど、 Move(動詞)がクラスってどいう言うこと?w これって、ゴミク図なの?
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
542 :デフォルトの名無しさん[sage]:2016/06/11(土) 15:16:00.71 ID:NAulAg4n - >>539
> 一見ネストが深いように見えるけど結構シンプルに纏まってると思う え? ちょっとまてよ?
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
543 :デフォルトの名無しさん[sage]:2016/06/11(土) 15:45:12.80 ID:NAulAg4n - >>540
これgetImageDataの中でキャッシュあるか調べてるからいけないんだよ。 一般論として、キャッシュというのは存在を意識しないようにコードにするべき。 関数の役割ってのが書いてないし、これだけじゃ読み取れないから難しいんだが、 そのgetImageDataっていうのは画像があれば、ポップアップウインドウを表示するんだろう? であれば、getImageData() ではなくて showImageData() とかいう名前にするべき。 そして、getCachedData()ではなく、こっちをgetImageData()にするべき。 getImageData()っていうのは単にImageDataを返すだけ、その中でキャッシュを使っていようが 使っていまいが関係ないし、別の仕組みのキャッシュを使うかもしれない。がgetImageData()を 使う人からはそんなこと知ったことじゃない >>535のコードは、chrome.storage.local を使っている箇所が、getCachedDataと getImageDataの2つに分かれているだろ? 関数の役目が明確に分離されていないからそうなる。 非同期の書き方の問題の前にまずやることがあるってことさ。 あと、スペース1個でインデントは見にくいからやめろw 最低でも2個だ。
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
544 :デフォルトの名無しさん[sage]:2016/06/11(土) 15:47:35.86 ID:NAulAg4n - で、これが修正コード例だ。
やりたいならばchrome.storage.local.getをPromise化する事もできるがね。 function getImageData(query) { return new Promise(function(resolve, reject) { chrome.storage.local.get(query, function(cachedJson) { if (isExist(cachedJson)) { resolve(cachedJson[query]); return; } fetch(window.googleCustomSearchApi + query) .then(function(response) { var json = response.json() chrome.storage.local.set({[query]: json}); resolve(json); }) .catch(function(err) { reject(err); }) }); }); } function showImageData(query) { getImageData(query) .then(function(json) { createPopUp(json.items[0]); positionPopUp(); }) .catch(function(err) { console.error(err); }); }
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
545 :デフォルトの名無しさん[sage]:2016/06/11(土) 15:56:05.66 ID:NAulAg4n - で、どうしてもgetImageData()の中身をPromise化したいならこんな感じかね?
動かせる環境がないので、これで正しく動いているかはしらない。 元のコードに合わせてisExistがfalseならreject()しているが、 nullを返して、データがnullだったらfetchしたほうがいいような気もするが。 function getImageData(query) { return new Promise(function(resolve, reject) { chrome.storage.local.get(query, function(cachedJson) { if (isExist(cachedJson)) { resolve(cachedJson[query]); } else { reject(); } }).cache(function()) { return fetch(window.googleCustomSearchApi + query) }).then(function(response) { var json = response.json() chrome.storage.local.set({[query]: json}); return json; }); }
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
548 :デフォルトの名無しさん[sage]:2016/06/11(土) 16:12:31.73 ID:NAulAg4n - >>545は本当に動くかどうかわからない。
実はcacheのあとにthenをつなげたことないんでねw まあ関数の中を試行錯誤すりゃできるだろうと思うけど。 最悪>>544でいいし。 "何をする" 関数か?(クラスか?)ってことをよく考えることが重要。 動くようにコードを配置するんじゃなくて、何をする関数か?を定義して それに合わない所はたとえコードが増えても外にだすべきだし、 入れるべきだと思えば、どうにかして持ってくる。 もちろん場合によっては、"何をする" の定義を変えてもいいけど はっきり定義させることが重要。 例えば、このgetImageData()はchrome.storage.local を使うことが前提になってるけど、 いろんなキャッシュの仕組みを入れ替えられるようにする関数(というかクラスになるだろうけど)を定義すれば getImageData()の中からはchrome.storage.localが消えて、キャッシュの仕組みを 入れ替えられるだけのことをするクラスができあがるわけ。
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
549 :デフォルトの名無しさん[sage]:2016/06/11(土) 16:15:59.14 ID:NAulAg4n - >>547
> が、前から疑問なのだが、何故お前らはネストにこだわるのだ? やりかけで覚えておかなければならないことが増えるからだよ。 Aが終わってからBをして、Bが終わってからCをする。というやり方よりも Aの途中でBをして、Bをしているその途中でCをするほうが疲れるから。 Cが終わったら、Bはどうなったんだっけ? そしてAはどうなったんだっけ?って 戻って行かないといけないからね。 言い換えると可読性の問題だからだ。 非同期とかそういうところが問題になってるんじゃない。 やりかけの作業を脳に貯めておくと言うところが問題なんだよ。
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
550 :デフォルトの名無しさん[sage]:2016/06/11(土) 16:20:02.55 ID:NAulAg4n - >>547
あと、そのコードの問題は「名前」が増える。 名前が増えるっていうのも、いちいち記憶して おかなければならないことだから面倒 限りある記憶領域は、記憶する価値のある物、 汎用的でどこでも使えることだけに絞る必要がある。 覚える価値がないものは覚えなくていい。 そのコードは関数の名前が増えているだけだが、 クロージャーじゃなくなっているから、変数の名前も増えるだろうね あと処理があちこちに飛ぶから、コードが長くなったらスクロールする回数も増えるよw もちろん関数が長ければ分けるが少なければその場に埋め込むという意味だ。
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
553 :デフォルトの名無しさん[sage]:2016/06/11(土) 16:35:45.96 ID:NAulAg4n - >>551
サンプルコードでやってるからだめなんだよw お前、頭の中で、このコードはsetTimeoutしかない。Main以外の名前は存在しない。 しかもそれぞれ短いコードで呼び出す順番に並んでいるいう「記憶」に頼ってコード読んでるだろ? それはお前だから出来ること。(短いから俺でも出来るけどさw) 実際に業務ではそういう「記憶」には頼れない。コードはもっと長いし 汎用的じゃないものは名前も覚えられない。(何日も経ったら忘れる) 汎用的でないものには、適切な名前をつけることも難しい。 仮にそのコードのまま、記憶に頼れないように書き換えてみようか? さっきと同じように気楽に読めるかい? どこでどう呼び出しが行われてるか探すだろ? function Kjads(){ console.log("a"); function cgrd(){ // あrtが console.log("c"); } // あrtが badf(fgaz); // あrtが function fgaz(){ // あrtが console.log("b"); asdfa(cgrd); // あrtが } // あrtが } Kjads();
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
555 :デフォルトの名無しさん[sage]:2016/06/11(土) 16:39:28.40 ID:NAulAg4n - >>554
もうそろそろ>>553をみて、記憶に頼ってるなって自覚したはずw > ちなみにクロージャーにはなっている。 なってない function Main(){ var v = 1 setTimeout(function() { console.log(v); }, 1000); } ↓ エラーになる function Main(){ var v = 1 setTimeout(Main_1, 1000); } function Main_1(){ console.log(v); } 変数vを渡すために、名前が増えるwww
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
557 :デフォルトの名無しさん[sage]:2016/06/11(土) 16:40:41.06 ID:NAulAg4n - >>554
> $.ajaxとかその場にだらだら全部書くほうが普通じゃないか? 下手なやつが多いだけ。 俺は関数に分けるべき理由が生まれれば当然分ける。
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
559 :デフォルトの名無しさん[sage]:2016/06/11(土) 16:44:00.74 ID:NAulAg4n - >>556
> 処理を必ず「上から下に」書く > > で対応している。というか、そもそも意図的に可読性を落とす必要はないだろ。 > 「上から下に」書けるところでは「上から下に」書くのが常識だろ。 ほらなw お前の常識w 何処かで、function hoge() {} じゃなくて var hoge = function() {} って 書けって言っていたやつが居るが、 (ちなみに俺はその必要がないならばfunction hoge()って書け派) これは上から下に書けない。 hoge(); var hoge = function() {} hage() var hage = function() {} まあ 「上から下に」"書けるところでは" って書いているところからもわかるように 書けない場合があると自覚してるんだろうがw その書ける所と書けない所、ここは書ける所だという前提を知ってるのも「記憶」だよねw
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
561 :デフォルトの名無しさん[sage]:2016/06/11(土) 16:46:15.25 ID:NAulAg4n - >>560
勝手にコード書き換えんなよw function Main(){ var count = 0; console.log('a: '+count++); setTimeout(Main_1,2000); function Main_1(){ var v = 1; console.log('b: '+count++); setTimeout(Main_2,1000); } function Main_2(){ console.log('c: '+count++); console.log(v); // エラーになる } } Main(); それともお前、ローカル変数は作るな。 全部クラス変数にしろとか言う派なのか?www
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
562 :デフォルトの名無しさん[sage]:2016/06/11(土) 16:50:41.71 ID:NAulAg4n - >>558
いやw 何が疑問なのかさっぱりわからないんだがwww
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
569 :デフォルトの名無しさん[sage]:2016/06/11(土) 18:02:04.85 ID:NAulAg4n - >>566
> 下手なわけではない。 > 通常、$.ajaxの場合はそこでしか使われない関数になるから、ネスト派ならそこにだらだら書く方が自然なんだ。 > ただ、「ネストが深くなる」のが嫌いなくせに、「ネストでしか書かない」のが俺には疑問なんだ。 いや、俺は$.ajaxでDeferred使うし、やっぱり下手なだけじゃね?
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
570 :デフォルトの名無しさん[sage]:2016/06/11(土) 18:05:04.82 ID:NAulAg4n - >>563
> どれが適切なんでしょうか どれか迷ったら、一番楽な方法を選べばいいよw 何でもそうだけど原則として楽になるように作られてるわけなんだしさ。 しばらくPromiseは触ってないから忘れたが、throwで任意のエラーオブジェクトでも 投げればいいんじゃね?
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
571 :デフォルトの名無しさん[sage]:2016/06/11(土) 18:07:10.39 ID:NAulAg4n - >>565
> クラスの場合は、コンストラクタだけ呼べても意味がないだろ。 意味あるぞ? function NantokaManager(params) { this.params = params; this.run = function() {} } var manager = new NantokaManager; manager.run() とかさ。
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
572 :デフォルトの名無しさん[sage]:2016/06/11(土) 18:08:34.97 ID:NAulAg4n - >>565
> 誰も普通の関数 hoge を全部 var hoge = function(){} と書けとは言ってない。 > お前が話について来れてないだけ。 俺もそんな話はしていない。 ついてこいよw
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
973 :デフォルトの名無しさん[sage]:2016/06/11(土) 18:13:31.35 ID:NAulAg4n - > 使いやすく、分かりやすいクラスであればいいし、
とか考えると、単一責任の原則とかでてきて、 役割で考えて、一つの役割だけをやるようにしましょう(=単一責任の原則) という話なるはずだが? お前、使いやすく、分かりやすければいいと言うだけで、 どうすれば、使いやすく、分かりやすくなるのかを 理解してないんじゃね?
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
975 :デフォルトの名無しさん[sage]:2016/06/11(土) 18:16:59.17 ID:NAulAg4n - http://d.hatena.ne.jp/asakichy/20090122/1232879842
・単一責任の原則(SRP) ・オープン・クローズドの原則(OCP) ・リスコフの置換原則(LSP) ・インターフェイス分離の原則(ISP) ・依存関係逆転の原則(DIP) オブジェクト指向設計に関する原則の頭文字をとって「SOLID」とまとめられた原則集。 http://qiita.com/hirokidaichi/items/d6c473d8011bd9330e63 S SRP Single Responsibility Principle(単一責務の原則) 「クラスを変更する理由は1つでなければならない」 O OCP Open/closed principle(開放閉鎖の原則) 「クラスは拡張に対して開き、修正に対して閉じていなければならない」 L LSP Liskov substitution principle(リスコフの置換原則) 「派生型はその基本型と置換可能でなければならない」 I ISP Interface segregation principle(インターフェース分離の原則) 「クライアントが利用しないメソッドへの依存を強制してはならない」 D DIP Dependency inversion principle(依存性逆転の原則) 「上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも「抽象」に依存すべきである。」
|
- オブジェクト指向システムの設計 171 [無断転載禁止]©2ch.net
1 :デフォルトの名無しさん[sage]:2016/06/11(土) 18:18:23.98 ID:NAulAg4n - http://d.hatena.ne.jp/asakichy/20090122/1232879842
・単一責任の原則(SRP) ・オープン・クローズドの原則(OCP) ・リスコフの置換原則(LSP) ・インターフェイス分離の原則(ISP) ・依存関係逆転の原則(DIP) オブジェクト指向設計に関する原則の頭文字をとって「SOLID」とまとめられた原則集。 http://qiita.com/hirokidaichi/items/d6c473d8011bd9330e63 S SRP Single Responsibility Principle(単一責務の原則) 「クラスを変更する理由は1つでなければならない」 O OCP Open/closed principle(開放閉鎖の原則) 「クラスは拡張に対して開き、修正に対して閉じていなければならない」 L LSP Liskov substitution principle(リスコフの置換原則) 「派生型はその基本型と置換可能でなければならない」 I ISP Interface segregation principle(インターフェース分離の原則) 「クライアントが利用しないメソッドへの依存を強制してはならない」 D DIP Dependency inversion principle(依存性逆転の原則) 前スレ オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net http://echo.2ch.net/test/read.cgi/tech/1464617322/
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
976 :デフォルトの名無しさん[sage]:2016/06/11(土) 18:19:01.24 ID:NAulAg4n - 次スレ
オブジェクト指向システムの設計 171 [無断転載禁止]©2ch.net http://echo.2ch.net/test/read.cgi/tech/1465636703/
|
- コードは設計書。その他のドキュメントは補足資料。 [無断転載禁止]©2ch.net
7 :デフォルトの名無しさん[sage]:2016/06/11(土) 18:19:26.63 ID:NAulAg4n - >>6
誰もドキュメント化しないなんて言ってないよ?
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
981 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:04:42.35 ID:NAulAg4n - 例えばクラスを作るというとき
ある人はいきなり関数の中身から書き出す ある人はクラスのインターフェースなどの設計から書き出す ある人は設計を鉛筆で下書きをしてから書き出す
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
982 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:05:44.58 ID:NAulAg4n - >>980
自分で関数を作る立場の人間に成りましょう。
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
984 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:07:37.02 ID:NAulAg4n - そういや絵が上手い人って、下書きもせずに
いきなり絵を描くことができちゃうんだよな。 あれなんでなんだろ?
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
985 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:08:55.57 ID:NAulAg4n - >>983
鉄骨を使う橋を作るときに作る設計=今はパソコンで書く=コードってことでしょう?
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
986 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:09:55.69 ID:NAulAg4n - 「コードが設計」って言ってる人は、設計をしないって
言ってるわけじゃないんだよ。 ソフトウェアの設計を一番書きやすいのは コードなのだから、コードを使って設計を書いているだけなんだよ。
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
989 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:14:29.37 ID:NAulAg4n - >>998
UMLで書くのも設計ってだけでしょう? コードも設計なんだよ。
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
990 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:15:29.58 ID:NAulAg4n - そういやUMLのLってランゲージ(言語)のLなんだよな。
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
992 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:21:30.82 ID:NAulAg4n - >>991
それなら将棋ソフトのコードを見ればいいだけじゃね? そのコードが設計だって言ってるんだから。
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
995 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:27:10.20 ID:NAulAg4n - 例えばロボットの設計図って書けばわかると思うけど、
ロボットの設計図があれば、材料とそれを加工する機械があれば 誰でも同じものを作れちゃう。 設計図っていうのはそのレベルのものだよ。 決して、頭、腕、胴体、足、だけ書いたようなものを 設計図とは思わないわけでw
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
996 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:28:00.73 ID:NAulAg4n - >>994
なんで運用チームに設計図出すんだ?w お前が思ってる設計図ってやっぱり世間で 想像されてるものと別物だろw
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
574 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:33:03.15 ID:NAulAg4n - >>573
え? お前コードは必ずプロトタイプを持つものっていう前提なの? どうやらお前は限定しているようだが、 俺は、どんな限定もしていない。
|
- オブジェクト指向システムの設計 170 [無断転載禁止]©2ch.net
1000 :デフォルトの名無しさん[sage]:2016/06/11(土) 19:36:29.89 ID:NAulAg4n - >>997
> え?設計書のないシステムを受け入れる客なんているの?wwww 客にコードは提出するだろ? お前、コードなしでエクセルに書いた図だけだして これが設計図ですで納品終わらせる気かよw
|
- + JavaScript の質問用スレッド vol.120 + [無断転載禁止]©2ch.net
576 :デフォルトの名無しさん[sage]:2016/06/11(土) 21:27:53.17 ID:NAulAg4n - >>575
お前がこう言ってきたんだろ? > クラスの場合は、コンストラクタだけ呼べても意味がないだろ。 だから俺は、コンストラクタだけ呼べても意味がある場合を言ったまで。 そしたらお前が「俺は共通プロトタイプをもった場合に限定してるんだ」って いい出したんだろw 俺はお前と違って何も限定していない。 コンストラクタだけ呼べても意味がある場合は 実際に存在している。
|
- オブジェクト指向システムの設計 171 [無断転載禁止]©2ch.net
8 :デフォルトの名無しさん[sage]:2016/06/11(土) 21:38:55.29 ID:NAulAg4n - メソッドというか関数だな。
評価関数とか、オブジェクトのメソッドのことだし。
|
- オブジェクト指向システムの設計 171 [無断転載禁止]©2ch.net
10 :デフォルトの名無しさん[sage]:2016/06/11(土) 22:02:32.22 ID:NAulAg4n - 飛行機が空を飛ぶ原理を、自分の言葉で表現して
納得してもらえるだろうかね。
|
- オブジェクト指向システムの設計 171 [無断転載禁止]©2ch.net
13 :デフォルトの名無しさん[sage]:2016/06/11(土) 22:18:04.06 ID:NAulAg4n - >>11
そういうこと。 ソースを出せって言われるように 匿名でオレオレ論を主張しても信用してもらえない。 匿名をやめるか、有名などれかを引用するしかない。
|
- お前らプログラミング言語どうやって覚えたんや? [転載禁止]©2ch.net
75 :デフォルトの名無しさん[sage]:2016/06/11(土) 22:20:28.81 ID:NAulAg4n - そしてそのJava VMは今はゴミクズ同然の扱いになったけど?
|