システム内部で、タイプ判別する場合、int型で行うのが良いのか、string型で行うのが良いのでしょうか。


例えば、同じページを表示する場合に、ユーザー権限が3つあり、ユーザー権限で条件分岐をする場合、
int型で「1:管理者, 2:ログインユーザー, 3:ゲスト」とするとタイプ判別が直感的に分かりくいですが、
string型で「admin:管理者, member:ログインユーザー, guest:ゲスト」とすると、
分かりやすいかと思いますが、システム内部でタイプ判別を文字列で持っても良いのでしょうか。

これは、クラスや関数を設計する際にも結構迷います。
ご意見お聞かせ下さい。

回答の条件
  • 1人2回まで
  • 登録:2007/10/19 22:23:42
  • 終了:2007/10/26 22:25:04

回答(5件)

id:KUROX No.1

KUROX回答回数3542ベストアンサー獲得回数1402007/10/19 22:33:58

ポイント20pt

public class User {

public final static int admin= 0;

public final static int member= 1;

public final static int guest= 2;

}

------------------------

swich(no){

case User.admin : 処理

break;

case User.member: 処理

break;

case User.guest : 処理

break;

}

--------------------------

定数かそれに類するもので、種別を定義で、それを使うべきだと思います。

string型でタイプわけするのは、悪いとは思わないけど。

でも、タイプをミスったりしても分かりにくいので、stringの判定は避けたいところ。

id:tomoyuki28jp

ご回答ありがとうございます。

おっしゃることはごもっともかと思います。

今回、webシステムを制作しているのですが、

webアプリケーション側は定数で問題ないのですが、

そうした場合、テンプレート内の条件判別をどうしようかなぁ

ということで悩んでおりました。

(ちなみに、今回はPHPでSmartyを利用しております。)

ご回答どうもありがとうございました。

2007/10/19 22:40:10
id:studioes No.2

studioes回答回数522ベストアンサー獲得回数612007/10/19 22:44:07

ポイント20pt

私はint派です。

と言うか、ビット派でしょうか。

論理積で複数グループを簡単に扱えるので。

#define ID_ADMIN 1

#define ID_MEMBER 2

#define ID_GUEST 4

みたいにしておいて、if((ID_ADMIN|ID_MEMBER)&REQUEST_ID)とかすると、ADMINとMEMBERならここは表示とか出来るので。

id:tomoyuki28jp

やはりまともな設計をしようと思ったらintの方がいいんですかね。

おっしゃること、ごもっともです。

大変参考になりました。

ご回答ありがとうございました。

2007/10/19 23:55:12
id:takabow No.3

noname回答回数51ベストアンサー獲得回数142007/10/20 03:33:46

ポイント20pt

2の方がおっしゃってるように私もビットフィールド(int)をつかいます.

あとは使う言語次第ですが,私は判別するタイプの一覧をenumで表現します.

こうするとIDEなどを使っている時はIDEのコード補完の恩恵が受けられるのがうれしいですね.

例えばC#での例ですが,

enum Groups {
    nobody = 0,
    admin = 1,
    member = 2,
    guest = 4,
    all = admin | member | guest
}

と定義して,使う時は

if( user == Groups.all ){ ... }
if( user == (Groups.admin | Groups.member) ){ ... }

のように使えます.

 

 

phpだとenumがないのでクラスを使って,

final class Groups {
    const nobody = 0;
    const admin = 1;
    const member = 2;
    const guest = 4;
}

if( user == Groups::admin ) {...}

と表現したりですかね.phpのconstだと,

const all = admin | member | guest;

のように演算結果を定義できないのがちょっぴり悲しいです.

id:airplant No.4

airplant回答回数220ベストアンサー獲得回数492007/10/20 16:15:56

ポイント20pt

私もEnum派です。

ちなみにVBA系でもEnumは記載できます(VB, Excel)。

Public Enum GType
    admin = 2 ^ 0
    member = 2 ^ 1
    guest = 2 ^ 2
End Enum

Sub useEnum()
    Dim User As GType
    
    User = admin
    If User And (admin Or guest) Then MsgBox "admin or guest"
    If User = admin Then MsgBox "admin"
End Sub
id:Bookmarker No.5

しおり回答回数191ベストアンサー獲得回数342007/10/20 22:22:25

ポイント20pt

オブジェクト指向なら、クラスを分けた方が良いと思います。

class user {
    virtual ~user() throw();
};
class admin: public user {/*...*/};
class member: public user {/*...*/};
class guest: public user {/*...*/};

デザインパターンとともに学ぶオブジェクト指向のこころ (Software patterns series)

  • id:KUROX
    ビット派の人はC言語上がりの人に多いです。
  • id:KUROX
    Stringでもよいですが、
    定数宣言してそれを使うようにしたほうが無難です。
  • id:Bookmarker
    http://q.hatena.ne.jp/1192800219#a770586
    理由を書き忘れていたので、コメントします。
    例えば、後で「power:パワーユーザー」を追加しようとすると、整数/文字列/列挙型等で識別子を管理して条件分岐するようなプログラムを書いている場合、そのような処理をしている箇所を漏れなく調査・変更しなければなりませんが、それは非常に面倒でバグの元になります。
    クラスを分けてクラスのインスタンスメソッドで処理を分けるようにしている場合は、user クラスを継承した power クラスを追加してインスタンスメソッドをオーバーライドするだけで「power:パワーユーザー」を追加できます。(実際にはオブジェクトを生成する部分も変更する必要がありますが)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません