質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

1895閲覧

クラスのインスタンス化の際に引数の値をプライベート変数に代入するのは冗長ですか?

canvas

総合スコア62

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2016/08/13 09:43

編集2016/08/13 16:06

質問内容は表題の通りです。

クラスのインスタンス化の際に引数の値をプライベート変数に代入するのは冗長でしょうか?

別質問「円クラスを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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2016/08/13 15:55

Java関係ないならJavaタグ外すべきかと…
guest

回答3

0

ベストアンサー

JavaScript

1function ViewController(canvasElement, circleList) { 2 var circleList = circleList; //ココです!!!!!!!!!!!!!!!!! 3 var canvas = canvasElement;//ココもです!!!!!!!!!!!!!!!!! 4}

circleList は仮引数と同じ名前を宣言しているので代入前と何も変わりません。
変数宣言前後で何も変わっていないので冗長だと思います。

canvas は名前が異なるので意味はありますが、名前を変えたいのなら仮引数を canvas にする方がシンプルになります。
「同じ対象を2つの変数で共有する事」に意味を見いだせなければ冗長だと思います。

Re: canvas さん

投稿2016/08/13 13:53

think49

総合スコア18156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

canvas

2016/08/13 14:33

回答ありがとうございます。仮引数に渡した値なりオブジェクトを関数内で利用する場合は、関数内のローカル変数に代入せずに使うのが適切ということなのですね。「同じ対象を2つの変数で共有する事に意味を見いだせなければ冗長だと思います。」とありますが、逆に意味を見出せるケースというのはあるのでしょうか?
think49

2016/08/13 15:49

同じ参照を持つなら意味はないと思います。別参照にしたり、値コピーして書き換え前後を保持することに意味を見いだせるかどうか、です。 - String値をreplaceして別のString値に書き換えた上で元のString値も残したい場合 - cloneNodeで要素ノードをコピー - オブジェクトをディープコピーして書き換え処理前後を比較できるように
canvas

2016/08/13 16:09

具体例を挙げて頂けて大変分かりやすかったです。ありがとうございました。
guest

0

こんにちは。

仮引数と同じ名前のローカル変数を定義してはいけないです。どちらをアクセスしたいのか指定出来ませんので。

Typescriptの方は同じ名前のメンバー変数を明示的にメンバー変数としてアクセスしているのでエラーになっていないだけとおもいます。

一般にプライベート変数はメンバー変数ですが、ご提示されたJSのソースはメンバー変数ではないですよ。ローカル変数です。

投稿2016/08/13 13:39

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

canvas

2016/08/13 14:31

回答ありがとうございます。仮引数と違う名前のローカル変数の場合はいかがでしょうか?
Chironian

2016/08/13 15:08

ローカル変数と仮引数は両方ともスタック上に確保されるケースが多いので、その場合は別の変数に代入する意味はあまりない場合が多いと思います。 しかし、バックアップ的に使いたい場合等もあるので必ずしも意味がないとは断言できません。 ローカル変数が値型か参照型なのか、仮引数が値渡しか参照渡しなのか、呼び出し元へ結果を返したいのか返したくないのか等、多数のパターンがあるのでもう少し絞って頂かないと厳密な回答はたいへん過ぎます。
canvas

2016/08/14 10:23

thin49さんからの回答をもとに上記回答を読み返しましたらスッと理解出来ました。ご回答ありがとうございます!
guest

0

程度にもよりますが10行くらいで終わるような関数であれば個人的には使いません。
ただし基本的には上の方に関数で使う入力が並んでくれていたほうがありがたいです。
引数がオブジェクトの場合、一部しか使わないということもあるでしょうし、テストするときに楽なので。

名前はl_, m_を接頭辞としてつけるとか変えたほうがいいと思います。
型がある言語では今でもハンガリアン記法が使われる場合もあります。

投稿2016/08/13 11:07

nullbot

総合スコア910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

canvas

2016/08/14 10:25

ハンガリアン記法なるものを初めて知りました。m_というのはメンバー変数を表すものなのですね。参考になりました。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問