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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JavaScript

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

Q&A

解決済

5回答

9501閲覧

波括弧でネストする意味は?

GCP

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JavaScript

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

0グッド

0クリップ

投稿2018/01/03 18:52

編集2018/01/03 19:48

ときどき、下のコードのようにわざと波括弧でネストしているものを見かけます

{ // 処理 }

初めてこれを発見したのはjavascriptでしたが、C#でも見ることができました。

ここで質問なのですが、

  • ズバリ、これをする意味はなんなのでしょうか?

個人的には、これはその中で使っている変数を外から使えないようにしているのかなと考えていますが、どうなのでしょうか?

  • 言語によって意味が異なってきたりもするのでしょうか?
  • 関数を使うのではいけないのでしょうか?

波括弧を使って一塊にしなければならないなら、関数化してしまったほうがいいんじゃないかな、と考えてしまいます。(もし波括弧でネストする意味が、変数を外から使えないようにするためなのなら)関数化すれば十分なのでは?と。

是非ご教授よろしくお願いします。

#追記
簡単なコードを作成し、検証をしました。タグにあるように、javascript, C#で行いました。

  • javascript

var: https://paiza.io/projects/LidyZurxUiK4zYEkpF2tTQ
let: https://paiza.io/projects/momiZ9Qtpm2jnwIIuOUfBQ

  • c#

https://paiza.io/projects/an8DRCTx6z0uYU9eIvVpig

javascriptでvarを使用した以外のものはすべてエラーとなります。
そのため、varを使用しないことを前提にしてしまえば「その中で使っている変数を外から使えないようにしている」というのは十分あり得ると思っていますが、どうなのでしょうか・・・?

2018/01/04、追記

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

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

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

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

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

guest

回答5

0

ベストアンサー

ブロック文 (BlockStatement)

JavaScript では {} は「ブロック」と呼ばれる構文で Statement の一種です。
if 文や for 文など、他の Statement の一部で Statement が要求される場所に使われることが多いですが、for 文の一部と受け取られがちで認知度が低いかもしれませんね。
他に、Label 文に使ったり、ブロックスコープを形成する為に使われることがあります。

ネストする

ブロック文の中に文を入れることを「ネストする」というのは不適切でしょうか?

同じ構文を入れ子にする」ことをネストすると表現します。
「ブロック文」と「文」は同じ構文ではないので、ネストとは表現しません。
ブロック文の中にブロック文が入れば、ブロック文をネストしていると表現して差し支えありませんが、

JavaScript

1if (x === 1) { 2 const y = 1; 3 4 { 5 const z = 1; 6 } 7}

先述の通り、if 文内のブロック文は認知されていないので、この説明で違和感を感じる人が多いかもしれません。

Syntax

plain

1IfStatement[Yield, Await, Return]: 2 if(Expression[+In, ?Yield, ?Await])Statement[?Yield, ?Await, ?Return]elseStatement[?Yield, ?Await, ?Return] 3 if(Expression[+In, ?Yield, ?Await])Statement[?Yield, ?Await, ?Return]

Re: GCP さん

投稿2018/01/03 19:13

編集2018/01/04 03:01
think49

総合スコア18162

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

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

GCP

2018/01/03 20:09

> 「ブロック」と呼ばれる構文で Statement の一種です。 なるほど、この波括弧の正体はブロック文というのですね。波括弧もif文の一部だと思っていましたが、ブロック文と組み合わせていただけだったと知り驚きました。 > 他に、Label 文に使ったり、ブロックスコープを形成する為に使われることがあります。 ブロックスコープを形成するためにブロック文を使うのなら、varはブロックスコープを作らないため、追記した「varを使用しないこと」を前提にすることができるので、「その中で使っている変数を外から使えないようにしている」とゆう予想は間違っていなかったということですね。Label文にいたってはそもそも知りませんでしたので、これから調べようと思います。 整理のためにごちゃごちゃと長文を書いてしまいましたが、全て解決しました。 大変ありがとうございました。
GCP

2018/01/03 20:18

もしよろしければ教えていただきたいのですが、ブロック文の中に文を入れることを「ネストする」というのは不適切でしょうか?「それはネストではない」という旨のご指摘を他回答でいただいたので、どうしても気になってしまい・・・。 厚かましいとは思いますが、どうかよろしくお願いします。
think49

2018/01/04 03:08

親記事に追記しました。
guest

0

こんにちは。

恐らくGCPさんは、例えば、下記のようなコードの内側の{}をネストと呼んだのだと思います。見ることが少なめな記述と思いますが、時々見かけますね。私は適切な呼び方と思います。

C#

1void foo() 2{ 3  { 4    // 処理 5  } 6}

内側の {} 内で定義したローカル変数は、その外側のブロックではアクセスできません。
これにより、そのローカル変数のスコープ(有効範囲)を限定できるため、可読性が上がり、かつ、バグを作りにくくなります。
そして、内側のブロックは外側のブロックのローカル変数にアクセスできます。関数にするとこれができず、一々パラメータで渡さないと行けないため、関数化した方が良い場合とそうでもない場合の両方があります。

投稿2018/01/04 03:04

編集2018/01/04 03:05
Chironian

総合スコア23272

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

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

0

下のコードのようにわざと波括弧でネストしているものを見かけます

例示のコードは別にネストはされてませんが…

if (条件) { if (条件) { } }

ネストとは↑のような状態

個人的には、これはその中で使っている変数を外から使えないようにしているのかな

簡単なコードを書いて確かめればいいと思います。

javascript

1var a = 0; 2 3if (a == 0) { 4 var b = 1; 5 if (b > 0) { 6 var c = a + b; 7 } 8} 9 10console.log(c);

変数が使えないのであれば、このコードはエラーになるはず。
どうなるかは御自分で試してください。

投稿2018/01/03 19:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

GCP

2018/01/03 19:44

ご回答ありがとうございます。 > 例示のコードは別にネストはされてませんが… ご指摘ありがとうございます。もしネストされていないとすれば、質問文やタイトルを編集しなければならないのですが、適切な用語に見当がつかないので、適切な用語を教えていただけないでしょうか? > 簡単なコードを書いて確かめればいいと思います。 仰る通りです・・・。。 ※この下からは質問文にも追記します タグにあるように、javascript, C#で検証を行いました。 - javascript var: https://paiza.io/projects/LidyZurxUiK4zYEkpF2tTQ let: https://paiza.io/projects/momiZ9Qtpm2jnwIIuOUfBQ - c# https://paiza.io/projects/an8DRCTx6z0uYU9eIvVpig javascriptでvarを使用した以外のものはすべてエラーとなります。そのため、varを使用しないことを前提にしてしまえば「その中で使っている変数を外から使えないようにしている」というのは十分あり得ると思っています。
otn

2018/01/03 22:34

> 適切な用語を教えていただけないでしょうか? 「波括弧で囲む」でしょうか。 二重以上にならないと「ネスト」とは言いません。
guest

0

ブロック文の中に文を入れることを「ネストする」というのは不適切でしょうか?

ブロックスコープをネストするって言ってもいいと思いますよ。
ただネストすんなとは思いますけどね。

関数を使うのではいけないのでしょうか?

「1度しか使わない場合関数を書かなくて良い」と思うのが僕の答えです。

以下関数を使わない理由です。

  • 1度しか使わない関数ならブロックスコープで代替した方が読みやすい
  • 1度しか使わない関数の名前を考えるのは無駄なコストである
  • 1度しか使わない関数なら外に書く場合スコープが汚染される、中なら呼び出し行が増えて可読性を損なう
  • トランザクションスクリプトは大体エントリポイントが1つなので長くても関数1つで良い

※手続き的な関数のこと、例えば画面の仕様に合わせて同系の処理が只管並ぶこと

ブロックスコープを使わなくても上手く仕組み作って1ブロックスコープ=1関数呼び出しにせめてできるだろ、って思う場合もありますが、やっつけの仕事で全部で1画面とかしかない場合だとか、ライブラリのコードサイズが気になる場合含め諸々導入する方が面倒だったりもするので、そういう場合はブロックスコープでもいいかなと。それでも全く使わないよりは変数のスコープ制限した方が良いと思いますしね。

まあ…ブロックスコープ内は大体お決まりのコーディングになるので、数が多くなれば関数作った方がそれでもいいですけどね。jsonのプロパティの指定は簡単にできるわけだし。

投稿2018/01/04 01:38

haru666

総合スコア1591

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

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

0

波カッコ内はスコープが変わります。
例えばこんなことができます。

javascript

1process.stdin.resume(); 2process.stdin.setEncoding('utf8'); 3 4{ 5 let str = "hello"; 6 console.log(str); // hello 7} 8 9let str = "!!"; 10{ 11 let str = "world!"; 12 console.log(str); // world! 13} 14console.log(str); // !!

コピペで変数がかぶるときに使うことができますが、関数を使えって話になります。
一体どんな時に使うんでしょうね。

投稿2018/01/04 01:07

iwamoto_takaaki

総合スコア2883

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

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

iwamoto_takaaki

2018/01/04 01:47

あいまいな記憶ですが、C#においてリファクタリングで一度インラインに展開して、関数を切りなおすときに私は使ったような気もします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問