人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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


●質問者: tomoyuki28jp
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:String すいか クラス ゲスト システム
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● KUROX
●20ポイント

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の判定は避けたいところ。

◎質問者からの返答

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

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

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

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

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

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

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

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


2 ● studioes
●20ポイント

私はint派です。

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

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

#define ID_ADMIN 1

#define ID_MEMBER 2

#define ID_GUEST 4

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

◎質問者からの返答

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

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

大変参考になりました。

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


3 ● noname
●20ポイント

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;

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


4 ● airplant
●20ポイント

私も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

5 ● しおり
●20ポイント

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ