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

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

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

Backbone.jsはRESTfulなウェブアプリケーションを構築するJavaScriptフレームワークです。

オブジェクト指向

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

プログラミング言語

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

JavaScript

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

6回答

8885閲覧

グローバル変数を使用しない設計方法

tarotarosu

総合スコア114

Backbone.js

Backbone.jsはRESTfulなウェブアプリケーションを構築するJavaScriptフレームワークです。

オブジェクト指向

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

プログラミング言語

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

JavaScript

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

1グッド

1クリップ

投稿2016/10/27 03:53

編集2016/10/27 08:24

###前提・実現したいこと
今、下記のようなグローバル変数が定義されているとします。
このグローバル変数はプログラム中のいたるところで使用されます。
(例えばボタンがクリックされたらクリックされたボタンに応じてグローバル変数の値を書き換えたり、これらの値を使って計算したり、色々です。)
実現したいこととしましては、これらのグローバル変数を使わないような設計にしたいということです。

最近Backbone.jsを勉強し始め導入を試みているのですが、グローバル変数があらゆるViewのメソッド内で乱用されています。
これでは、疎結合化を図るBackbone.jsの理念(?)からは大きく外れてしまうのではないかと懸念しています。
例の場合だと、ファイルを分割したときにglobal_1が様々なファイルをまたいでいるので、保守性のことなどを考えるとこれではいけませんよね…

Backbone.jsに限った話ではないですが、様々な処理で変数を共有させたい場合、どのような設計方法がベストなのでしょうか?
あまり具体例がなくぼんやりした質問ですが何かご回答を頂けると助かります。

###例

javascript

1global_1; 2global_2; 3global_3;

###追記
より具体的な例で説明します。

<li>をクリックしたらその<li>内のテキストを取得して、<button>がクリックされたら先ほど取得したテキストを表示する。 という処理をjQueryだけでは以下のように記述しました。

###HTML

html

1 <div class="demo"> 2 <ul> 3 <li id="list1">list1</li> 4 <li id="list2">list2</li> 5 <li id="list3">list3</li> 6 </ul> 7 <button type="button" id="button">Button</button> 8 </div>

###jQueryでの記述

javascript

1$(function(){ 2 var listText; 3 4 $('.demo li').click(function(){ 5 listText = $(this).text(); 6 }); 7 8 $('#button').click(function(){ 9 console.log(listText); 10 }); 11});

これを私なりにBackbone.jsを使って書き換えると、以下のようなコードになりました。

###テンプレート

html

1<script type="text/template" id="text-template"> 2 <%- text %> 3</script>

###Backbone.jsでの記述

javascript

1var listText; 2 3//liのModel 4var LiModel = Backbone.Model.extend({ 5 defaults: { 6 text: 'list1' 7 } 8}); 9 10//liのView 11var LiView = Backbone.View.extend({ 12 tagName: 'li', 13 template: _.template($('#text-template').html()), 14 events: { 15 'click': 'getText' 16 }, 17 getText: function(){ 18 listText = this.model.get('text'); 19 }, 20 render: function(){ 21 var template = this.template(this.model.toJSON()); 22 this.$el.html(template); 23 return this; 24 } 25}); 26 27//ボタンのView 28var ButtonView = Backbone.View.extend({ 29 el: '#button', 30 events: { 31 'click': 'showText' 32 }, 33 showText: function(){ 34 console.log(listText); 35 } 36}); 37 38var liModel = new LiModel(); 39var liView = new LiView({model: liModel}); 40$('.demo').append(view.render().el); 41var buttonView = new ButtonView(); 42

このような処理をBackbone.js的に実装しようとしても、「listText」というグローバル変数を記述するような方法でコーディングしてしまいます。
この程度ならlistTextが存在しても何の問題もないのですが、実装したい機能としてはもっと複雑で、listTextが様々な処理に絡み、listTextのような変数もかなり増えてくることが予想されます。

Backbone.jsに関係なく、クラス間でうまいこと変数を受け渡しできればいいのかなーと思うのですが、良い実装方法が思い浮かびません…

###追記2
liのViewがおかしかったので少し修正しました

yuu208👍を押しています

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

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

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

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

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

guest

回答6

0

サンプルコードではよくわからないのですが、書き換えがあるグローバル変数は良いものではありません。
バグを作りやすくし、デバックをやりづらくします。

また、通常はグローバル変数は極力使わない方法で作られているので、多用されている環境というのは珍しいと考えていいです。

逆に考えると、世間のほかのソースコードを見ればどのように組めばよいか書いてあるということになります。

ということで、Backbone.jsの本やwebで特にサイトを実際に作ってみるようなものを一通り自分の環境で作ってみましょう。また、さらに2つ3つレベルが違うものに挑戦すればだいたいどのようなパターンが存在するかつかめるようになると思います。

投稿2016/10/27 04:03

iwamoto_takaaki

総合スコア2883

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

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

0

ベストアンサー

一般的に、グローバル変数を使わない書き方をするということは、その変数は何らかのクラスオブジェクトが保持し、必要になったらそのオブジェクトから値をGetしてくることになります。変更が必要になったらSetですね。(ゲッター・セッター)
セッターには範囲チェックを入れたりもできるので、より安全に作れるということになります。
ただし、設計の初期段階から、そういうことを意識し注意しながら設計する必要があります。途中からグローバル変数をなくそうとすると、影響度が大きく中々大変な作業になります。
例えば、Commonクラスのようなものを作成してこのクラスはシングルトンにしておき、複数のオブジェクトから参照や変更が必要な変数はこのCommonクラスが全て保持するような書き方をします。
ただ、Commonクラスの中に保持する変数のスコープはプラベートにしておかないと、クラス変数にした意味がありません。

グローバル変数は、全てではありませんが、設計やインターフェースを見直せば無くせるものも多いはずです。

投稿2016/10/27 09:01

PineMatsu

総合スコア3579

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

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

0

複数の機能間でデータを共有する方法は handleEvent, data-*属性、カスタムイベント、WeakMap 等があります。

handleEvent

HTML

1<div class="demo"> 2 <ul> 3 <li id="list1">list1</li> 4 <li id="list2">list2</li> 5 <li id="list3">list3</li> 6 </ul> 7 <button type="button" id="button">Button</button> 8</div> 9<script> 10'use strict'; 11document.querySelector('.demo').addEventListener('click', { 12 text: '', 13 handleEvent: function handleClick (event) { 14 var target = event.target; 15 16 if (target.tagName === 'LI') { 17 this.text = target.firstChild.data; 18 } else if (target.id === 'button') { 19 console.log(this.text); 20 } 21 } 22}, false); 23</script>

data-*属性

要追記。

WeakMap

要追記。

カスタムイベント

要追記。

Re: kerokero335 さん

投稿2016/10/27 23:56

編集2016/10/29 05:42
think49

総合スコア18162

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

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

0

backbone.js を利用したことがないので、まちがっていたらごめんなさい。
backbone.js は MVC のフレームワークなので、編集中の値などは model に保持するのが正しいのではないでしょうか。 model内で自分の好きなように構造化し、その構造は view の構造と独立に設計できることが MVC のメリットだと思います。 MVC を使っている以上、グローバル変数は不要なのではないでしょうか?

それで、

javascript

1getText: function(){ 2 listText = this.model.get('text'); 3},

このコーディングはやろうとしていることとあっていますか?
li をクリックしたらそのテキストの値を model にセットするべきなのでは?
click イベントの場合、引数に要素を受け取れるのではないでしょうか。それを this.model.set で格納し、button のイベントでは、そのモデルの値を this.model.get で参照すればよいのではないでしょうか。

投稿2016/10/27 08:45

mit0223

総合スコア3401

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

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

0

色々なケースがありますのでこれが正解!と言うのはありませんが、一般にはグローバル変数は悪とされてますね。
個人的にはグローバル変数で困った事はほとんどありませんが使わないようにしてます。
で、どのような?という、問いに対しては、メイン的な処理でローカル宣言して、パラメータで渡す。と言うのが、昔の一般的な考えかと思います。

投稿2016/10/27 04:07

KEgt

総合スコア12

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

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

0

>このグローバル変数はプログラム中のいたるところで使用されます。

のだからグローバル変数を利用するのが正しいと思いますが
どうしても気になるなら、
所詮javascriptのグローバル変数はユーザーによって改ざんされる可能性はあるので
クッキーやinput type=hiddenなどでタグのvalueとして保持し、都度参照・更新すれば
よいかもしれません。

投稿2016/10/27 04:02

yambejp

総合スコア114814

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問