質問内容は表題の通りです。
クラスのインスタンス化の際に引数の値をプライベート変数に代入するのは冗長でしょうか?
別質問「円クラスをMVC的に実装したいです!」に掲載している以下のコードを例にすると、ViewControllerオブジェクトの初期化時に引数に渡しているcircleListをViewController内部のcircleListに代入しています。
個人的には該当クラスの上部にそのクラスが保持する変数を置いておいたほうが分かりやすい気がしていて、このようにしているのですが、IDEでは変数の重複宣言の警告が表示されてしまうのでダメなのかなと思いました。
やはり、以下のように引数の値をプライベート変数に入れるのは冗長であり、一般的には使われないのでしょうか?
追記(18:47)
表題はクラスのインスタンス化という話になっていますが、JavaScriptの場合は単純に関数の場合の話に置き換えたほうが適切なのかもしれません。
つまり、「関数の引数に渡した値を関数内部の変数に代入することは冗長でしょうか?」という質問が適切な気がしてきました。
コード
JavaScript
1//コントローラークラス 2function ViewController(canvasElement, circleList) { 3 4 var circleList = circleList; //ココです!!!!!!!!!!!!!!!!! 5 var canvas = canvasElement;//ココもです!!!!!!!!!!!!!!!!! 6 var canvasView = new CanvasView(canvas.getContext("2d")); 7 var stateMap = { 8 isDragging: false 9 } 10 11 circleList.add(new Circle(20, 20, 20)); 12 circleList.add(new Circle(60, 60, 20)); 13 14 circleList.getList().forEach(function(circle) { 15 canvasView.drawCircle(circle.getPosition(), circle.getRadius()); 16 }) 17 18 19 canvas.addEventListener("mousedown", function(event) { 20 var isTouchedPointOnCircle = circle.hitTest(event.offsetX, event.offsetY); 21 22 if (isPointInCircle === true) { 23 stateMap.isDragging = true; 24 console.log("ドラッグを開始"); 25 } 26 }); 27 28 canvas.addEventListener("mousemove", function(event) { 29 if (stateMap.isDragging === true) { 30 console.log("ドラッグ中"); 31 } 32 }); 33 34 canvas.addEventListener("mouseup", function(event) { 35 stateMap.isDragging = false; 36 console.log("ドラッグ終了"); 37 38 }); 39 40} 41 42 43 44//ビュークラス 45function CanvasView(context) { 46 var context = context; 47 48 this.drawCircle = function(position, radius) { 49 context.beginPath(); 50 context.arc(position.x, position.y, radius, 0, Math.PI*2, false); 51 context.fill(); 52 } 53 54} 55 56 57// circleの管理クラス 58function CircleList() { 59 60 var list = []; 61 62 this.add = function(circle) { 63 list.push(circle); 64 } 65 66 this.getList = function() { 67 return list; 68 } 69 70} 71 72 73 74// circleのモデルクラス 75function Circle(x, y, radius) { 76 77 var x = x + radius; 78 var y = y + radius; 79 var radius = radius; 80 81 this.getPosition = function() { 82 return {x: x, y: y}; 83 } 84 85 this.getRadius = function() { 86 return radius; 87 } 88 89 this.hitTest = function(x, y) { 90 console.log("ヒット判定の実装をする"); 91 return true; 92 } 93 94} 95 96 97 98var controller = new ViewController(document.getElementById("canvas"), new CircleList());
追記の再掲と追々記
表題はクラスのインスタンス化という話になっていますが、JavaScriptの場合は単純に関数の場合の話に置き換えたほうが適切なのかもしれません。
つまり、「関数の引数に渡した値を関数内部の変数に代入することは冗長でしょうか?」という質問が適切な気がしてきました。
TypeScriptで上記のようなコードを書く場合はこんな感じになる訳なので、
そもそも、変数の重複宣言云々の警告メッセージもIDEで表示されることはありませんからね。
TypeScript
1class ViewController1 { 2 3 constructor(private canvasElement, private circleList) { 4 this.canvasElement = canvasElement; 5 this.circleList = circleList; 6 } 7 8}
または、
TypeScript
1 2class ViewController2 { 3 4 private canvasElement: HTMLElement; 5 private circleList: CircleList; 6 7 constructor(canvasElement: HTMLElement, circleList: CircleList) { 8 this.canvasElement = canvasElement; 9 this.circleList = circleList; 10 } 11 12}
回答3件
あなたの回答
tips
プレビュー