2016-04-01 7 views
0

私のJSコードです。 Sudoku Grid(9)を作成しました。私はそれをしましたが、私のコードは明らかにDRYではありません。私は多くの方法を試しましたが、最終的には成功しませんでした。たぶん誰かが、この170行のコードをもっと「プロフェッショナルな」ものに変換する手助けをしてくれるかもしれません。前もって感謝します!このJSコードはどのようにDRYするのですか? whileループ

var canvas; 
canvas = openGraphics(); 

var x; 
var y; 
var gap; 
var count; 
x = 20; 
y = 20; 
gap = 25; 
count = 0; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 45; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 70; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 95; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 70; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 95; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 120; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 145; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 170; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 195; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 220; 

while(count < 9) { 
    canvas.setStroke(1); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 20; 
gap = 75; 

while(count < 3) { 
    canvas.setStroke(3); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 95; 
gap = 75; 

while(count < 3) { 
    canvas.setStroke(3); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
} 

count=0; 
x = 20; 
y = 170; 
gap = 75; 

while(count < 3) { 
    canvas.setStroke(3); 
    canvas.drawRect(x, y, gap, gap);  
    count++; 
    x = 20 + gap * count; 
    canvas.paint(); 
}  
+2

あなたがかもしれませんこれを[codereview.stackexchange.com](http ://codereview.stackexchange.com) – Martin

+2

DRY =同じようなコードを繰り返さないための原則をコーディングしないでください。うーん、興味深い! –

+0

繰り返しコードのパターンはありますか?コードをコピーしてコードを少し微調整してしまう状況はありますか?そのための関数を書く。それは一言で言えばDRYです。また、これはそれをよりドライにするものではありませんが、より慣用的になります。 'while'ループを[' for'ループで置き換えてください。](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) –

答えて

0
function whileCount9(){ 
    while(count < 9) { 
     canvas.setStroke(1); 
     canvas.drawRect(x, y, gap, gap);  
     count++; 
     x = 20 + gap * count; 
     canvas.paint(); 
    } 
} 

//use whileCount9(); anywhere you would normally place the whole while loop. 

私もwhileCountLessThan(3);

短く、より表現
+0

@smerny私には表示されませんこれ以上乾燥させる方法はありません。はい、変数名が繰り返されていますが、変数がどのように変化しているのか分からない限り、値は毎回異なり、ユニークです。 – Observer

+0

ちょうど観測値で、countは常に0から始まるので、 'num'を渡して' for(i = 0; i smerny

0

ように私たちをあなたは3を持っていた気づいたので...

function whileCountLessThan(num){ 
    while(count < num) { 
     canvas.setStroke(1); 
     canvas.drawRect(x, y, gap, gap);  
     count++; 
     x = 20 + gap * count; 
     canvas.paint(); 
    } 
} 

var canvas; 
canvas = openGraphics(); 

var boards = [ 
    { x: 20, y: 20, gap: 25, num: 9 }, 
    { x: 20, y: 45, gap: 25, num: 9 }, 
    { x: 20, y: 70, gap: 25, num: 9 }, 
    { x: 20, y: 95, gap: 25, num: 9 }, 
    { x: 20, y: 70, gap: 25, num: 9 }, 
    { x: 20, y: 95, gap: 25, num: 9 }, 
    { x: 20, y: 120, gap: 25, num: 9 }, 
    { x: 20, y: 145, gap: 25, num: 9 }, 
    { x: 20, y: 170, gap: 25, num: 9 }, 
    { x: 20, y: 195, gap: 25, num: 9 }, 

    { x: 20, y: 20, gap: 75, num: 3 }, 
    { x: 20, y: 95, gap: 75, num: 3 }, 
    { x: 20, y: 170, gap: 75, num: 3 } 
] 

function boardCreator(obj){ 
    var count = 0; 
    while(count < obj.num) { 
    canvas.setStroke(1); 
    canvas.drawRect(obj.x, obj.y, obj.gap, obj.gap);  
    count++; 
    obj.x = 20 + obj.gap * count; 
    canvas.paint(); 
    } 
} 

for (i = 0; i < boards.length; i++) { 
    boardCreator(boards[i]) 
} 
+1

それらのために誰かの宿題を書き直すだけではありません。長期的には、特にあなたのコードがどういう理由で説明されているのかを説明していないと、彼らを助けません。明らかに、彼らはJSの基本について非常に強く把握していないので、この仕組みがどのように機能し、なぜそれが良いのかを正確に理解することはまずありません。 –

+0

@MikeC多くの人がより良いやり方を見ているので、人々はソフトウェアの「パターン」を参照します。彼らが自分のコードを理解していれば、これは大きな飛躍ではありません。上記のソクラテス的な方法を試してみましたが、それは実際に人がどのようにパターンを学ぶかではありません。 – tyler

+0

どちらも少しです。私はコードが学習のためにたくさんあることを完全に認めています。私はちょうどコードを読んで多くを学んだ。しかし、基本を学ぶまでは、大きな画像を見ることはできません。彼らはコードを関数に分割する方法を理解していないことや、 'for'ループの代わりに' for'ループがこれに適したツールであることを考えれば、彼らは背後にある高水準の設計アイデアを集めることができるだろうと本当に疑ういくつかの助けなしにあなたのコード。また、人間は直観の自然な拡張としてパターンを学習することができます。コピーするだけのものではありません。 –

関連する問題