🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

Q&A

解決済

2回答

2749閲覧

python if elif文が入った classを隠蔽したいのですが、elif文が確実に追加される恐れががあるため、外の保守する仕組みで呼び出す工夫をしたいです。

hit701

総合スコア148

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

0グッド

0クリップ

投稿2019/10/18 23:47

お世話になります。現在のプログラムは、下記の通りです。

python

1# get_check_info.py 2 3# ------------ インポート設定 ------------ # 4 5lass ItemCheck(object): 6 def __init__(selfget_check_info.py, checking_items): 7 self.checking_items = checking_items 8 9 def checker(self): 10 # ["23456"["sumitomo", "7654321"]] 11 # keyは"2345" 12 # v 13 for key, value in self.checking_items.items(): 14 plat = value[0] 15 id = value[1] 16 # ------------ ----------- # 17 if plat == "xxx": 18 print(id) 19 """ 20 長いコード 21 """ 22 elif plat == "yyy": 23 print(id) 24 """ 25 長いコード 26 """ 27 28 else: 29 continue

長いこコードは、凄く長くなる場合があり、

下記のプログラムの様にしたいのです。

python

1#get_check_info2.py 2 3# ------------ インポート設定 ------------ # 4import func_def 5 6checking_items = {"23456"("sumitomo", "7654321")} 7 8class ItemCheck(object): 9 def __init__(self, checking_items): 10 self.checking_items = checking_items 11 12 def checker(self): 13 # ["23456"["sumitomo", "7654321"]] 14 # key = "23456" 15 # value[0] = "sumitomo" 16 # value[1] = "7654321" 17 for key, value in self.checking_items.items(): 18 plat = value[0] 19 id = value[1] 20 # ------------ ----------- # 21 for row in func_def.stock_dict: 22 if row == plat: 23 print("-----------------") 24 print(id) 25 func_def.company(plat, id) 26 27 else: 28 continue 29

以上が、隠蔽したいプログラムです。本当は、もっと長いです。
保守の観点から隠蔽したいのです。

get_check_info2.pyから、func_defをインポートしていますが、下記の様なプログラムを考えています。

python

1# func_def.py 2 3stock_dict = ["sumitomo", "ufj"] 4 5class Company(object): 6 def __init__(self, plat, id): 7 self.plat = plat 8 self.id = id 9 10 def inner_comp(self): 11 if self.plat == "sumitomo": 12 chk_info = Sumitomo(self.plat) 13 14class Sumitomo(object): 15 def __init__(self, plat, id): 16 self.plat = plat 17 self.plat = id 18 def func_sumitomo(self): 19 print("") 20 21###追加クラスが続きます。

func_def.pyは、変更可能PGです。
func_def.company(plat, idで、class Companyを用いて、sumitomo, ufjなどで得られる情報を、それぞれ取得したいです。
ここで質問ですが、結局、下記のPGでコントロールするかと思います。
この方針で良いでしょうか?

python

1 if self.plat == "sumitomo": 2 chk_info = Sumitomo(self.plat) 3

もっと、良いアイデアは、ないでしょか?
ご指導、ご鞭撻の程、よろしく、お願い申しあげます。

敬具

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

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

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

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

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

guest

回答2

0

解決しました。

python

1# func_def.py 2 3name_to_class_dict = { 4 'sumitomo': Sumitomo, 5 'nomura': Nomura, 6 ... 7}

python

1#get_check_info2.py 2 3import func_def 4import get_chk_items 5 6#checking_items = {"23456"["sumitomo", "7654321"]} 7#checking_items = dict(checking_items) 8class ItemCheck(object): 9 10 def __init__(self, checking_items): 11 self.checking_items = checking_items 12 13 def checker(self): 14 # ["23456"["sumitomo", "7654321"]] 15 # key = "23456" 16 # value[0] = "sumitomo" 17 # value[1] = "7654321" 18 for key, value in self.checking_items.items(): 19 plat = value[0] 20 id = value[1] 21 if plat in func_def.name_to_class_dict: 22 company_class = func_def.name_to_class_dict[plat] 23 sto = func_def.Company(company_class, id) 24 sto.inner_comp()

以上が、隠ぺいしたいコードです。
中身を変更することは、許さない様に出来ました

変更が許されるコードを書きました。

python

1# func_def.py 2 3class Company(object): 4 def __init__(self, plat, id): 5 self.plat = plat 6 self.id = id 7 8 def inner_comp(self): 9 if self.plat == "Sumitomo": 10 chk_info = Sumitomo(self.plat, self.id) 11 chk_info.func_sumitomo() 12 13 14 15class Sumitomo(object): 16 def __init__(self, plat, id): 17 self.plat = plat 18 self.plat = id 19 def func_sumitomo(self): 20 21 # 長いコード 22 print("")

以上です。
ありがとうございます

投稿2019/10/19 22:32

編集2019/10/19 22:39
hit701

総合スコア148

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

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

0

ベストアンサー

簡単には

pyhton

1# func_def.py 2name_to_class_dict = { 3 'sumitomo': Sumitomo, 4 'nomura': Nomura, 5 ... 6}

という 文字列→クラス の辞書を定義しておいて、該当の箇所は

python

1if self.plat in name_to_class_dict: 2 company_class = name_to_class_dict[self.plat] # クラス 3 chk_info = company_class(self.plat) # インスタンス化

とでもして、if文の羅列は避けますね。

投稿2019/10/19 01:05

quickquip

総合スコア11231

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

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

hit701

2019/10/19 12:08

quiqui様 ご回答ありがとうございます。 実際に試して見みました。 確かに、辞書化すると羅列を防ぐ事は可能です。 しかし、メソッドの「func_sumitomo」を呼び出す事が出来ません。 少し考えてから、解答欄に書きます。
hit701

2019/10/19 22:41

quiqui様のおかげで、ひらめきました。 保守可能プログラムが出来そうです。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問