現代的なプログラミングで、価格表のようなものはどのように表現するものなのでしょうか。

たとえば、宅配便の配送料(出発と到着の都道府県により価格が決まる価格表)などを実装する場合、かつては二次元配列で価格表を実現していましたが、モダンな言語ではどのように実装するのがベストでしょうか。
なお、DB等の利用は行いません。

実装言語はC#の予定ですが、java,Ruby等言語は問いません。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/22 10:40:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答7件)

id:azusa1967 No.1

回答回数22ベストアンサー獲得回数1

ポイント18pt

ハッシュテーブル

id:hakob

配列をハッシュテーブルにするのが現代的な手法でしょうか。

また、二次元表のような物をハッシュテーブルにすると言うことは、ハッシュテーブルを要素として持つハッシュテーブルを定義する事になると思いますが?

2010/02/15 13:21:38
id:horonict No.2

回答回数257ベストアンサー獲得回数51

ポイント17pt

プログラム自体より価格表の変更頻度が高い場合は、価格表を外部のテキストファイル(CSV形式など)に持たせ、プログラム起動時に配列に読み込むようにします。

価格表のようなものはExcelで作成した方がチェックがしやすいためです。

id:hakob

外部CSV自体は読み込んだあと、C#であればDataTableクラスあたりかな…?で、読み込んで処理をするということですね。

妥当な手段ですが、CSVを直接読まれたりしたくないような場合はどうするのが良いでしょうか。暗号化ZIPにするとかかな。

2010/02/15 13:23:17
id:supermomonga No.3

回答回数17ベストアンサー獲得回数2

ポイント17pt

オブジェクト指向プログラミング言語(OOPL)での実装を前提に考えますと、クラスを定義してやるのが良いかと思います。

クラスとは「型」であり「振る舞い」ですので、「価格表」という振る舞いをする型、つまりクラスを定義します。

id:hakob

価格表クラスを定義するとして、どういうクラスを作るのでしょうか。

『価格表オブジェクト.get価格( 出発都道府県 , 到着都道府県)』

といったようなメソッドを定義するようなイメージでしょうか。

実装の隠蔽、引数が文字列でも内部で変換が可能、間違った文字列「例:土佐県」などを引数に与えた場合のエラーチェックが可能、などがメリットでしょうか

2010/02/15 13:26:54
id:Harnoncourt No.4

回答回数41ベストアンサー獲得回数3

ポイント17pt

価格表のメンテナンスを考慮すると、エクセルなどの外部ファイルに持たせておくべきだと思います。現代的とかそういう以前に、ビジネス系ソフト設計の常識です。

id:hakob

大元のデータはExcelにて管理されています。また、Excelに管理されたデータをもとにマクロやワークシート関数を使ってソースコードへ変換するのは一瞬ですので。。


なお、価格表はユーザに閲覧不可という前提でお願いします。

2010/02/15 13:41:08
id:horonict No.5

回答回数257ベストアンサー獲得回数51

ポイント17pt

CSVを直接読まれたりしたくないような場合はどうするのが良いでしょうか

そのようなビジネスアプリの場合、プログラム本体や価格表はサーバ側に配置するのが普通です。サーバには論理的/物理的アタック防止措置が施されるはずですから、無用な暗号化はしないのが普通です(バグの温床になるため)。


どうしても暗号化が必要なほどの機密情報でしたら、まずRDBMSを導入し、DBの暗号化機能を利用するでしょう。

id:hakob

外部ネットワークと切り離された状態になる可能性のあるアプリなのでって私書いてありま・・・せんね。書き忘れてました。

ノートPCを持ち運び、営業先等でネットワークにつながってなくても使用可能という話なので、その前提でお願いします。すみません。

2010/02/19 18:18:24
id:yuuta10 No.6

回答回数3ベストアンサー獲得回数0

ポイント17pt

八ッシュテーブルだと思います

id:freemann No.7

回答回数335ベストアンサー獲得回数55

ポイント17pt

データを読まれたくないのであれば、既出である、自作のクラスを作って、それを一旦バイナリ形式でのシリアライズをして、ユーザが使用する時はそれを読み込んで(デシリアライズ)、使用してはどうでしょうか。

  • id:infograve
    そもそもデータ処理の実装でDBなしとか、二次元配列以外の回答が無いと思うんだが。

    単純な2次元データをクラスにするとかオブジェクトにするとか無駄の極みだし、
    変更を楽にするにはDBを使用するべきだろうし。
  • id:hakob
    infograveさん、ありがとうございます。
    うーんそうなるとローカルデータベースとかってことになるんでしょうかね。。。

    二次元データを連想配列の二次元表にして、引数を列挙型にして…なども試してみましたが、記述量が膨大になって変更管理が大変になりそうでしたし、確かに無駄ですよね。
  • id:supermomonga
    確かに最近はSQLiteなんて物も有り手軽にDBを扱うことができるので、単純な表としてデータを扱う程度ならクラスなんかを定義せず素直にDBを使った方が良いかもしれませんね。

    まぁそれもデータ量によると思いますが。
    「出発と到着の都道府県により価格が決まる」となると47^2パターンかな?
  • id:hakob
    supermomongaさん、ありがとうございます。

    やっぱりローカルデータベースに持つのがいいのかなぁ。
    データ量についてですが、価格表以外にもいろいろ係数などがあるのでかなり数は多いです。
  • id:supermomonga
    >価格表クラスを定義するとして、どういうクラスを作るのでしょうか。

    価格表の仕様によって異なります。

    例えば価格が出発地と到着地さえ解れば計算式で算出できる場合、計算アルゴリズムを組み込んだメソッドを実装するなどすれば、わざわざ全通りの価格をデータとして保持させるよりはスマートですね。
    まぁ今回の例では計算できる類の物ではないと思いますが。
    他には、「速達の場合は+200円」の様な条件付けを仕様として追加したい時などは、クラスを定義して置いた方が遥かに良いです。

    最初の実装は面倒でも、堅牢性・メンテナンス性など、型定義のメリットは大きいと思いますよ。


    >『価格表オブジェクト.get価格( 出発都道府県 , 到着都道府県)』
    >といったようなメソッドを定義するようなイメージでしょうか。
    >実装の隠蔽、引数が文字列でも内部で変換が可能、間違った文字列「例:土佐県」などを引数に与えた場合のエラーチェックが可能、などがメリットでしょうか

    そうですね、アクセサ含めカプセル化は重要です。

    また、「単純な2次元データをクラスにするとかオブジェクトにするとか無駄の極み」というコメントもありましたが、必ずしもそうとは言えません。
    例えばもし「AからBへの送料とBからAへの送料は同じ」という仕様なのであれば、データを47^2パターン定義するのは無駄です。
    単純に「A-B間の料金」をデータとして定義しそのデータへアクセスする仕組みをクラスで実装してやればいいのですが、2次元配列だとそうはいきませんね。
    また価格が変動した場合もAからB・BからAと2ヶ所の価格を書き換えなければいけないといったデメリットもあります。

    このように、データの振る舞いを考えて実装するというのが良いでしょう。


    >データ量についてですが、価格表以外にもいろいろ係数などがあるのでかなり数は多いです。
    大量のデータをこねくり回すのであれば、それこそDBを使うのが「現代的」な気がします。
    分析関数なんかをちゃんと覚えればかなり高度なデータ操作もできますよ。
  • id:infograve
    > データ量についてですが、価格表以外にもいろいろ係数などがあるのでかなり数は多い
    > ローカルデータベース

    supermomonga さんと同じで、DBを使うのが「現代的」だと思うのですが、
    C#であれば、価格計算をクラス化してデータはMSXMLライブラリでXMLから構造で持ってくるとか。

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

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

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

回答リクエストを送信したユーザーはいません