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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

5回答

7817閲覧

フラグを使わないプログラミング?

CaizMartin

総合スコア15

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2015/07/09 12:43

http://anopara.matrix.jp/2014/04/11/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E4%B8%AD%E7%B4%9A%E8%80%85%E3%81%AB%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%BB%E3%81%97%E3%81%84%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89/

こちらのサイトの記事を読みまして
「14. 複雑な内部状態を定義しない」のところに

現代的な高級言語を使う状況でそもそもいわゆる「フラグ」を利用するケースなど殆ど無いと言える。

と書いてあるのですが高級言語でフラグを使わない具体的な方法を教えてほしいです。

現在rubyを使っているので出来ればrubyかpythonでお願いします。

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

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

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

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

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

guest

回答5

0

ベストアンサー

「フラグを使わない具体的な方法」については、「Stateパターン」を参照してください。

ちなみに、ここで話題にしているフラグ(Bool型の変数)は、関数やメソッド内のローカル変数ではなく、オブジェクト指向におけるクラスのインスタンス変数についての話です。これは、forやwhileなどのロジックを制御するのとは別の話です。

投稿2015/07/10 14:22

Stripe

総合スコア2183

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

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

CaizMartin

2015/07/10 22:56

回答ありがとうございます。 まだ詳しく調べてませんが今まで自分がめんどくさい処理をしていたことが良くわかりました。
guest

0

この記事の人がどういう立場の人なのか分かりませんが、書いてある半分は正しいですが、半分は宗教の世界です。

この人の言う”高級言語”の定義が分かりませんが、高級だろうが低級(アセンブラ等)だろうが、ロジックはロジックです。
実践的なコードでフラグ(=BOOL値を保持する変数)を使わない、というロジックは基本的にありえません。

コードの基本は、「他人が読んで内容が把握できるようにする」「冗長にしない(これは記事でも書いてあります)」です。
それは変数名の付け方やコメントの付け方なども含みます。

for文を使うプログラマーをダメと言って悦に入る人の言うことを真に受けない方が良いです。
全部eachを使えば良いと考えている人の方がダメだと思います。

投稿2015/07/09 12:59

terushu

総合スコア358

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

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

otn

2015/07/09 13:28

この人の言い分が正しいかどうかは意見が分かれるところでしょうが、こういう流儀でとおすのはありでしょう。そういう意味で宗教というのは言えてます。 >for文を使うプログラマーをダメと言って悦に入る人の言うことを真に受けない方が良いです。全部eachを使えば良いと考えている人の方がダメだと思います。 この人が言ってるのは、forを使えば出来るからと言ってeachを覚えないのはダメだということですね。全然違いますよ。
terushu

2015/07/09 13:37

2行目はただの私の感想です。 最大値を求めるのにforを使うのとeachを使うのとで、吐き出される中間コードにほぼ差がないとするなら、どちらを選択するかは自由であって、片方を”ダメ人間”扱いするこの人の態度は賛成できませんね。 ruby使う人はそもそもeachを覚えないという事はないでしょう。
otn

2015/07/09 22:50

>勉強嫌いな一部のダメプログラマは 勉強嫌いがダメという主張なので、 >どちらを選択するかは自由であって、片方を”ダメ人間”扱いする と、「両方知った上でこちらを選択する人はダメ」と、誰も言ってないことを批判してもしょうがない。 >最大値を求めるのにforを使うのとeachを使うのとで、(中略) >ruby使う人はそもそもeachを覚えないという事はないでしょう。 Rubyについての話限定なら最大値を求めるにはmaxやmax_byを使うべきでしょう。
terushu

2015/07/10 14:09

正直、自分でサンプルを要求しておいて、実際提示されたらたいして長くもないのに「長いからパス」なんて書く人にいちいち揚げ足取りされたくないですね。 昔から攻撃的な書き込みが多いので、ご性格なのでしょうが。
otn

2015/07/10 14:42 編集

すいません。言われなく他人が誹謗されるのを看過出来なくて。 他人のことなので、放っておけば良かったのかもしれません。 もう一度最初に書いたことを書きますが、この人の主張は宗教かもしれないけど、これはこれで何もおかしなことはありません。 興味があれば、「真に受けない方が良い」とかの言葉に惑わされず、よく読んでみてください。
terushu

2015/07/10 15:04

これを貼ってこの話題はおしまいにしましょう。 http://feely.jp/2304/ 私の意見も記事主の意見もあなたの憤慨も、どれを採用するかは閲覧者の自由なのです。
guest

0

該当サイトの記述の意図は、誤解を恐れずに書くと
シンプルイズベスト
己に厳しく、他者には寛容に
検証可能でなければ意味が無い、正しさは証明される必要がある
コメントに頼り過ぎるな、美しいコードは自ら語る。コメント不要ではない。
14. 複雑な内部状態を定義しない
は、記述通り、フラッグを使うなでは無い。
ただの、例示
データ駆動モデルでは、データをして語らしむる

投稿2015/07/09 13:27

daive

総合スコア2028

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

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

guest

0

他にも例があるとおもいますが、”複数クラスを一つのオブジェクトとして表現’している例として次のようなものはどうでしょうか。

PersonクラスにはPriveteな変数Sexがある。
Personクラスの各メソッドには、if Sex == Female ... のような条件分岐がたくさんある。
Sexがとり得る値に”性別不明”などを追加した場合は、上記のすべてのメソッドに渡る。

であるなならば、状態変数のSexを廃止して、PersonのサブクラスMaleとサブクラスFemaleを追加したほうがコードがスッキリするよってことじゃないかと思う。

現代的な高級言語の指す意味は、継承を出来るオブジェクト指向言語や関数渡しが出来る言語(さらにはmixinが使える言語?)といった意味だと考えられます。

投稿2015/07/11 15:52

iwamoto_takaaki

総合スコア2883

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

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

CaizMartin

2015/07/12 00:47

回答ありがとうございます。 状態変数じゃなくそれぞれの状態のサブクラスを作ったほうが分かりやすいってことですね。
Stripe

2015/07/12 02:14

変化しない不変なもののことを状態とは呼びません。 そもそも、Personクラスはオブジェクトではなく、ある値の型を定義したものなのでは? オブジェクトには内部に隠蔽されるものが必要です。 SexをむりやりPrivateにしていますが、PersonにとってのSexって本当にPrivateなものなのですか?
iwamoto_takaaki

2015/07/12 04:27

>Stripeさん あまり良い例ではなかったのかも知れませんね。 Privateな変数Sexを持ったクラスはgetterを持つべきだと思います。 (ココらへんは使っている言語によって考え方が違うのかな?) 仰るとおり普遍なものは状態と呼びません。しかし、不変なものを変数として定義することはあります。”複数のオブジェクトを一つのクラスとして表現していない”という部分の一例として不変なものを状態として定義している例として上げました。 他にもStateパターンの例を挙げる方法も考えましたが、ちょっと良い例が思いつかなかったので・・・
Stripe

2015/07/12 05:33

「不変なものを変数として定義する」ことは、基本的にありません。不変なのですから、定数として定義するのが普通です。 ただ、プログラミング言語によっては、定数をうまく定義できないため、変数で代替えすることがあります。 あなたの言う、「Privateな変数Sexを持ったクラスはgetterを持つ」というのも、そのような言語において「Publicな定数」を実装することなのだと思います。
iwamoto_takaaki

2015/07/12 14:17

コンストラクタで変数に値をセットして、私はインスタンスが存在する間変化がない変数をよく使うのですが、こういう場合は定数にはできないと思ってます。何か方法があるのでしょうか?
Stripe

2015/07/12 14:51

何か方法があるもなにも、それが定数です。 コンストラクタは定数を初期化できます。 定数には、「final」や「const」などのキーワードを付けて、それが定数であることを明示したりしますが、それを書かなくても値を更新しないことで実質的に定数とすることもあります。
iwamoto_takaaki

2015/07/12 15:07

constやfinalでは、インスタンス毎ではなく、クラス毎に定義されてしまうことにはなりませんか?(Javaですよね・・・)
Stripe

2015/07/12 15:23

ん? 特に言語は特定しませんが、仮にJavaだったとして。 public class Person { final String sex; Person(String sex) { this.sex = sex; } } 普通にインスタンス毎に定義できますが?
iwamoto_takaaki

2015/07/12 15:56

Javaのfinalって、コンストラクタで値を設定できるのですね。しらなかった、理解できました。 私はコンストラクタで設定できるから変数と呼んでました。
guest

0

題材として、フラグを使ったプログラムを提示してください。

投稿2015/07/09 12:49

otn

総合スコア84533

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

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

CaizMartin

2015/07/09 13:01

コメントありがとうございます。 画像を表示するプログラムです。 http://ideone.com/CbFego 他にもこうしたほうがいい等ありましたらお願いします。
terushu

2015/07/09 13:44

命名則の乱れやわかりにくさなど細かいつっこみはなしとして、操作によってどうするべきかを格納するという意味でのフラグなら、必要ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問