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

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

ただいまの
回答率

90.48%

  • C#

    7449questions

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

「if, else, switch, for, while などの条件分岐やループ制御を使わないですむとコードが見やすくなる」

受付中

回答 13

投稿

  • 評価
  • クリップ 5
  • VIEW 6,857

coke2

score 11

「if, else, switch, for, while などの条件分岐やループ制御を使わないですむとコードが見やすくなる」
と耳にしました。

if elseの条件分岐はとても頻繁に使用しています。

string[] fruits = new {"apple", "strawberry", "orange"};

foreach(string fruit in fruits){
 if (fruit.Contains("apple") || fruit.Contains("strawberry")
   MessageBox.Show("color is red");
 else  if (fruit.Contains("orange")
   MessageBox.Show("color is orange");
}

とかです。
これを条件分岐やループ制御なしで書くととってできますか?
もっと見やすいコードがあれば教えてください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 13

+16

例えば以下とかどうぞ
State パターン
Javaですがオブジェクト指向としての考え方ですので同じです。

if や switch などの分岐なくしてプログラムは書けませんので、必ず使います。

ただ、ここはこれじゃダメだろーという部分はあります。
例えば、

switch(会員ランク)
{
    case シルバー会員:
        // シルバー会員用の金額計算
        break;

    case ゴールド会員:
        // ゴールド会員用の金額計算
        break;

    default:
        // 一般会員用の金額計算
        break;
}

プラチナ会員が増えた場合
ランクで分岐してるとこ全部洗い出さないとダメじゃないか。。。
おいおい・・・めちゃくちゃあるじゃねーか!・・・これ全部にcase足していくのかよ。。。
みたいになってきますので、
こういう場合は、Stateパターンを使うべきです。

GetMember().Rank.GetPrice(定価);

書かれている例で言うと、Fruitクラス作って、中で Color を持てば終わりのような気もします。

foreach(Fruit fruit in fruits){ 
   MessageBox.Show("color is " + fruit.Color); 
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/30 16:21


    ありがとうございます。
    classいいですよね。

    キャンセル

+7

こんにちは。

「無駄な」条件分岐を書くことって意外にあるので、それを減らしましょうということではないでしょうか?
バグの主な原因の1つは条件分岐ミスですし。

例えば、a, bがbool型の時、

if (a && b) {
    foo();
} 
if (!a && !b) {
    foo();
}


よりは、

if (a == b) {
    foo();
}


の方が良いと思います。
これはちょっと無理やりな例ですが、似たようなケースは身近に転がっていると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/31 09:43

    こんにちは。おっしゃるとおりですね。不要な条件分岐が残っていたりするのは、定期的にrefacteringするといいなと思います。

    キャンセル

+7

9 年前になめらかなコードと名前をつけてみたものの、私以外には流行っていない用語のようです。
それはさておき、ポリモーフィズム自体が特異点を除去し、NUllObjectパターンなどの各種デザインパターンが特異点を除去し、オブジェクト指向以前からある特異点除去方法としてはテーブル化 (連想配列を使うといいよ、と他の回答にあるようなもの) や番兵なんかがあるわけです。
特異点がなくなると見通しがよくなり、潜在的なバグも減りますが、特異時の処理が隠れてしまい、一般的に抽象度が高まるので、慣れていないと逆に理解しにくくなってしまう懸念があります。

if や switch が少ないから読みやすい、というのは必ずしも真ではありませんが、読みづらい≈潜在的なバグの温床になっている≈メンテする気になれない、ようなコードは無駄に if や switch が多い、というのは(経験的に)真です。

あ、あと、たくさんコードを「読んで」、それなりにコードを書いていると、これは駄目だろうという if 文と、これは問題ないだろうという if 文の違いが感覚的にわかるようになってきます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/05 19:58

    ベタベタのプログラムは、みんな文句を言っているものの、
    一般的な技術者の水準から見た場合、実は一番分かりやすかったりしますからね。。。

    抽象度が高まったオブジェクト指向のプログラムは、拡張性は高くなりますが、追いづらいのは間違いないです。
    正確に追うには、それなりのスキルを要しますしね。

    決して単なる技術オタクの自己満足にならないように、ある程度万人受けする、
    妥協点を見つけて書ける人が、チームには必要だと思います。

    キャンセル

  • 2016/04/05 20:51

    異論ありません。
    私の場合は、大学でも最初に就職した会社でも、言語自体を学ぶカリキュラムなどはない、すなわち、C 言語なら C 言語自体については知ってて当たり前、知らなきゃ自分で時間作って勉強しとけ、というのが当たり前、という最後の年代だったように感じます。言いたいこととしては、当時と今では「一般的な技術者の水準」がだいぶ違うのだろうな、という老人の繰り言なわけですが、世の中で必要とされているエンジニアの数が桁違いなので全体のレベルが下がるのは必然と言えば必然で。
    私個人としては自分が使うものを自分で作るだけで、もはや誰かとチームを組んでコーディングすることもないでしょうから、思う存分技術オタクの自己満足をさせてもらっていますけれども。

    キャンセル

+6

何事もそうですけど,「~だからこうした方がいい」というのはある意味正解で,ある意味ハズレだと思うんですよね

すでにたくさん回答があるのであれですけど,この回答群の中から好みの回答を選ぶのだってif ~ then ~ elseでしょうしね.

今回の命題の 「if, else, switch, for, while などの条件分岐やループ制御を使わないですむとコードが見やすくなる」なんてのもその通りで,

使わないでいいならそれに越したことはない

でしか無いと思うんです.

そのためにはコーディングの軽いうちに熟考し,あ,このケースがあるな,こんな感じでパターンが増えそうだな,どうやってまとめとこうかな?といった考え方を常に持つことが重要だと考えます.

たとえばroot_jpさんの解答の例に有る条件が増えたときの対処,なんていうのはすごくわかり易い例でして(+1させていただきました!),このようなケースは実に多くあります.

仕事柄工場の生産管理システムなどに携わっているのですが,品種の追加(新製品に対応するので,新しく生産する品物を増やしたい)なんてことがありますと,以前の品種コードをgrepし,そのコードに関連したところを片っ端から改造していく,なんてことをする羽目になっています(あ,これはベースのソフトの設計が悪くて泣かされているパターンです).

知識がある今ならばこんな風に設計して~,こんなクラスで実装して~,とか言えますけど,今更そんな改造は出来ないですね(動いているコードが正義,なんて皮肉もあります).

ですので,条件分岐やループ制御は自分の知識で十分理解できているところのみ省き,後は普通にコーディングする,というのがおすすめです(それが可読性が良い,ということです).

そもそも条件分岐やループ制御が自在にできるのがソフトウェアの強みです.
(ハードウェアで組まれたシーケンス制御なんてちょっと動作を変えるためにすげぇ改造が必要なんです…)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/31 13:08

    ほんとうです。とても実感こもっていて、共感しました。
    いろいろ理解して、最適な方法を見つけたいです。

    キャンセル

+5

root_jpさんが言われているstateパターンが定石だと思います。

今回の場合、if-elseなどによる条件分岐けが多いとき、もっと保守性や可読性、拡張性の高いコードにするにはどうしたら良いか…という古典的(で、多くの人が遭遇する)問題だと思います。
こういった問題の解決策というのは、多くの場合、先人の方々によってデザインパターンが既に考えだされていることが多いです。

結局、どれだけデザインパターンを理解して、使いこなせるかが、可読性のある(そして保守性、拡張性もある)コードを書く近道(もちろん命名規則やJavadocの書き方、リファクタリングの技術など色々他にも学ぶべきことはありますが。)だと思います。
デザインパターンについては、書籍などで体系的に一度学習されると良いと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/31 13:13

    そうですね。
    みなさまにご回答いただいていて、感謝するとともに、これは古典的で典型的な質問なのだな、と認識しました。
    classでifをなくせるというのは、今現在のわたしにはとてもvividなtopicで、重点的に身につけたいと考えているところです。
    ちょっとステップアップできそうな、満開間近の春です。

    キャンセル

+4

Stateパターンはおすすめの方法ですが、サンプルコードにはちょっと大げさかもと感じたので、ほかの方法を紹介します。

「if, else, switch, for, while などの条件分岐やループ制御を使わないですむとコードが見やすくなる」 
と耳にしました。

私は、あまり同意できません。分岐が多くなるのはよくないコーディングの結果であって、分岐そのものを問題にするより、ネストが深い(C#の場合、中括弧の数が多い)が問題だと思います。

と言いつつ、ネストがのもよくないコーディングの結果だと思ってます。なぜネストが深くなってしまうのかというと、大きなことを一挙にやろうとしているからです。

それで、色の名前を判定するgetColorNameメソッドといろを表示するshoeColorメソッドを定義して下記のようなコードにしました。

using System;
using System.Linq;

public class Hello{
    public static void Main(){
        Func<string, string> getColorName =
         fruit => {
                if(fruit == "apple") return "red";
                if(fruit == "strawberry") return "red";
                if(fruit == "orange") return "orange";
                return "unknown color";
            };

        Action<string> showColor = 
            fruit => Console.WriteLine("Color is " + getColorName(fruit));

        string[] fruits = new string[]{"apple", "strawberry", "orange"};

        foreach(var fruit in fruits) showColor(fruit);
    }
}


特に見てほしいのは、getColorNameメソッドで、色を判定できたらすぐさまreturnをすることで、コードを単純化しています。メソッドを細かく分けることに慣れていない場合、すぐにreturnをするコードは不安になるとおもいますが、十分にメソッドの機能を小さくできていれば問題にはなりません。

HashTableやDictionaryがコードが単純だとは思います。今回はメソッドを分ける例を出したかったので、あえて使っていません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

時と場合と言語しだいじゃないスかねえ。
シンプルにするのと分かりやすいのとは違うと思うし。
// PHPですんませんが…
// if を使わない例として
// $fruit に果物の名前が入ってるとして
$ar = array("apple"=>"red", "strawberry"=>"red", "orange"=>"orange");
echo "color is " . $ar[$fruit];

ループなら高階関数が使えれば一行で済む場合もあるけど、
そういうコーディングに慣れてない人には難解ですしねえ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/30 16:18

    ありがとうございます。
    PHPも読めます。
    やっぱりこんな風になりますね。

    キャンセル

+3

LiveScriptで書いてみました。
遷移先の画面で下記のコードを張り付けてrunボタンを押してみてくだしあ

fruits-colors =
  apple: \red
  strawberry: \red
  orange: \orange
to-color = (name)-> fruits-colors.(name) or \nothing
output-color = (fluits)-> fluits |> to-color |> -> console.log "color is #it"
<[apple strawberry orange]> |> each output-color

私は英語力がないのであまり良い書き方は出来ませんが、
英語っぽく書いてみたり、関数型プログラミングを覚えると応用が効きやすいかとおもいます。
How to write a code like English(英文のようにプログラミングをする方法)

C#に応用出来るかはわかりませんが、
私はPHPのみでしたが、LiveScirtを業務で触るようになってからPHPのソースコードも影響うけてカラフルに書けるようになりました。
LiveScriptはマイナー過ぎるので、RubyやElixir、Haskellが良いかもしれません。。。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

「if, else, switch, for, while などの条件分岐やループ制御を使わないですむとコードが見やすくなる」 

条件分岐やループってのは構造化プログラミングで必須要素なので、まったく使わないというわけにはいかないでしょうが。。。

(new List<string> {"apple", "strawberry", "orange"}).ForEach(
  fruit => MessageBox.Show(fruit.Contains("orange")?"color is orange":"color is red")
);


コレクションとラムダ式と3項演算子を組み合わせるとこんなものか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/30 16:12

    C#なら.ForEach()ですけどこれ言語は何ですか?

    キャンセル

  • 2016/03/30 16:14 編集

    ForEachの誤りです。修正します。
    # ちなみにC#です。

    キャンセル

  • 2016/03/30 16:21


    ありがとうございます。
    3項演算子は微妙な気がします。

    キャンセル

+2

Ç#でなくて C++ でのコードになりますが、
この場合は連想配列をつかうことで、条件分岐をなくすことができます。
くだものの種類がふえたり、その色の定義を変更するときに、一番変更量がすくないのは最後に示した方法です。
1.cpp

// g++ -std=c++11 1.cpp

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
  string fruits[] = {"apple", "strawberry", "orange"};

  // 質問文にあった方法
  for(string fruit : fruits) {
    cout << fruit << " ";
    if (fruit == "apple" || fruit == "strawberry") {
      cout << "color: red" << endl;
    } else if (fruit == "orange") {
      cout << "color: orange" << endl;
    }
  }
  cout << endl;

  // 連想配列をつかって条件分岐をなくした方法 その1
  std::map<std::string, std::string> colors = {
    {"apple", "red"}, {"strawberry", "red"}, {"orange", "orenge"},
  };
  for(string fruit : fruits) {
    cout << fruit << " color: " << colors[fruit] << endl;
  }
  cout << endl;

  // 連想配列をつかって条件分岐をなくした方法 その2 (colos だけを使う)
  for (const auto &pair : colors) {
    cout << pair.first << " color: " << pair.second << endl;
  }

  return 0;
}


実行例

$g++ -std=c++11 1.cpp

$ ./a.out
apple color: red
strawberry color: red
orange color: orange

apple color: red
strawberry color: red
orange color: orenge

apple color: red
orange color: orenge
strawberry color: red

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

この問題なら連想配列がいいと思います

Hashtable fruits = new Hashtable();
ht.Add("apple", "red");
ht.Add("strawberry", "red");
ht.Add("orange", "orange");

foreach(string fruit in fruits.Values){
    MessageBox.Show("color is " + ht[fruit]);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

こういうのでしょうか?

using System;
using System.Linq;
using System.Collections.Generic;
class Test
{
    public static void Main(string[] args)
    {
        var fruits = new List<string> {
            "fuji apple",
            "wild strawberry",
            "hassaku orange",
            "forbidden fruit",
        };
        var fruitColor = new Dictionary<string, string>() {
            { "apple", "red" },
            { "strawberry", "red" },
            { "orange", "orange" },
        };
        fruits
            .Select(fruit => fruitColor.FirstOrDefault(kv => fruit.Contains(kv.Key)).Value)
            .Select(color => "color is "+ color)
            .ToList()
            .ForEach(str => Console.WriteLine(str));
    }
}

これが「見やすい」かどうかは人それぞれだと思います。Linqや関数型プログラミングに慣れている人はこちらの方がより「見やすい」と感じるでしょうが、そうで無い人にとっては逆にわかりづらく思えるかも知れません。

この書き方は「見やすい」こと以外に利点があります。それは、「書き換えやすい」ことです。たとえば、新たに"lemon"について"yellow"を足したくなったとしましょう。if文の時は分岐を増やして、また同じ事を書く必要がありますが、こちらではfruitColorというDictionaryに{"lemon", "yellow"}を追加するだけで終わります。他にも、"color is ..."というところを"色は...です。"に書き換えたいとか、大文字小文字を無視したいとか、表示するのは最初の数個までにしたいとか、表示の方法を変えたいとかいうとき、ほとんどの場合が1行書き換えるか、追加するだけで済みます。

しかし、最初に言ったとおり、これはLinqや関数型プログラミングに慣れていることが前提です。慣れれば簡単ですが、慣れない内は難しいと感じるかと思いますので、全ての人に勧められるわけではありません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「見やすさ」と言うか、
この先の展開も考慮して考えます

このソースを見て、内容は、リストにある「リンゴ」や「オレンジ」に対して、
その色を表示するプログラムである
「リンゴ」や「ストロベリー」はリストにしている
リストにしていると言う事は、「この後このリストは増えるかもしれない」

さて、「この先、このリストが増えるかもしれない」と考えた時、
リストに項目が増える度に if 文の条件式を治す事になる
 if (fruit.Contains("apple") || fruit.Contains("strawberry") 
こういう式は避けた方が良いと判断します。

つまり、
フルーツのリストを作るのであれば、
色のリストも合わせて作った方がこの先の展開を考えた場合見やすくなる

だって、
 if (fruit.Contains("apple") || fruit.Contains("strawberry") 
この後に、 || fruit.Contains(赤い果物) が、永遠と並ぶ事を考えて
みたら判るでしょ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • C#

    7449questions

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

  • トップ
  • C#に関する質問
  • 「if, else, switch, for, while などの条件分岐やループ制御を使わないですむとコードが見やすくなる」