2017-08-10 12 views
1

私はまだPython(3.5)を学んでいますが、いくつかのオブジェクトに多くの値を割り当てる必要があるため、このコードを使用しています。それ。私は、ループの中の「コードの少ない行」がループを使用しない場合よりも時間がかかることを理解する知識が不足しているため、これを求めています(ファイルサイズは小さくなりますが、 。パフォーマンスに影響を与えずにコード行を減らす

アプローチ1:

# 01 
    self.lineReferencia1.setText(utilidades.ensure_its_str(registro[16])) 
    self.lineConcepto1.setText(utilidades.ensure_its_str(registro[17])) 
    self.lineCantidad1.setText(utilidades.ensure_its_str(registro[18])) 
    self.linePrecio1.setText(utilidades.ensure_its_str(registro[19])) 
    self.lineDescuento1.setText(utilidades.ensure_its_str(registro[20])) 
    # 02 
    self.lineReferencia2.setText(utilidades.ensure_its_str(registro[23])) 
    self.lineConcepto2.setText(utilidades.ensure_its_str(registro[24])) 
    self.lineCantidad2.setText(utilidades.ensure_its_str(registro[25])) 
    self.linePrecio2.setText(utilidades.ensure_its_str(registro[26])) 
    self.lineDescuento2.setText(utilidades.ensure_its_str(registro[27])) 
    # 03 
    self.lineReferencia3.setText(utilidades.ensure_its_str(registro[30])) 
    self.lineConcepto3.setText(utilidades.ensure_its_str(registro[31])) 
    self.lineCantidad3.setText(utilidades.ensure_its_str(registro[32])) 
    self.linePrecio3.setText(utilidades.ensure_its_str(registro[33])) 
    self.lineDescuento3.setText(utilidades.ensure_its_str(registro[34])) 
    # 04 
    self.lineReferencia4.setText(utilidades.ensure_its_str(registro[37])) 
    self.lineConcepto4.setText(utilidades.ensure_its_str(registro[38])) 
    self.lineCantidad4.setText(utilidades.ensure_its_str(registro[39])) 
    self.linePrecio4.setText(utilidades.ensure_its_str(registro[40])) 
    self.lineDescuento4.setText(utilidades.ensure_its_str(registro[41])) 

アプローチ2:

items = (
    (self.lineReferencia1, registro[16]), (self.lineConcepto1, registro[17]), (self.lineCantidad1, registro[18]), 
    (self.linePrecio1, registro[19]), (self.lineDescuento1, registro[20]), (self.lineReferencia2, registro[23]), 
    (self.lineConcepto2, registro[24]), (self.lineCantidad2, registro[25]), (self.linePrecio2, registro[26]), 
    (self.lineDescuento2, registro[27]), (self.lineReferencia3, registro[30]), (self.lineConcepto3, registro[31]), 
    (self.lineCantidad3, registro[32]), (self.linePrecio3, registro[33]), (self.lineDescuento3, registro[34]), 
    (self.lineReferencia4, registro[37]), (self.lineConcepto4, registro[38]), (self.lineCantidad4, registro[39]), 
    (self.linePrecio4, registro[40]), (self.lineDescuento4, registro[41])) 
    for i in items: 
     i[0].setText(utilidades.ensure_its_str(i[1])) 

注:この方法で、私はわずか10にコードの20行を低減するが、実際のコード4つのセクションだけではなく、27個のセクションを持つので、目標は135行のコードを減らすことです。

アプローチ3:

代わりにタプルのタプルのデータを格納するための辞書の使用は、proccesingの時間でより効率的でしょうか?

アプローチ4:

私は各項目の代わりに、ループのための方法/機能を使用する必要がありますか?

実際の質問:パフォーマンスや可読性に影響を与えずに、そのファイルのコード行を減らす方法はありますか?どうやって?どうして?

+1

私の即座の反応:なぜ 'variableName1'、' variableName2'などがあるのですか?それらをデータ構造体で一緒に追加します。 'variableName = [...]'は、それらを反復処理することができます。私はコードが非常に不明瞭になるので、アプローチ2には強くお勧めします。 – pingul

+0

おそらく、あなたがこのコードを維持しようとしている唯一の人であれば、あなたが望むものは何でもできます。しかし、将来他の人がそれを維持/変更しなければならない場合、たとえそれが繰り返しであっても、それをコーディングするときに明白になる方がよいでしょう。それはcut'n'pasteとエディタのためのものです。 –

+1

末尾の数字と異なる名前の変数がコード匂い( 'linePrecio1'、' linePrecio2'、 'linePrecio3'、' linePrecio4')です。これらのもののためにリストや辞書やオブジェクトのようなものを使う方が良いでしょう。 –

答えて

7

コード自体がひどく開発インタフェースのように見えますが、あなたはそれで仕事は、あなたがプログラム的

だから、グループIDは、インデックスがポイントと属性を参照getattrとオブジェクトの属性を取得し、のようななめらかを作ることができなければならないことを仮定して

groups = (1, 2, 3, 4) 
attrs = ('Referencia', 'Concepto', 'Cantidad', 'Precio', 'Descuento') 
idx = (15, 22, 29, 38) 

for group, index in zip(groups, idx): 
    for i, attr in enumerate(attrs): 
     getattr(self, 'line' + attr + str(i)).setText(utilidades.ensure_its_str(registro[i+index])) 

全体的なコードの品質について:

  • な命名(シーケンシャルな名前で)本当に悪いデザインです。シーケンスがある場合は、おそらくこのデータを順番に格納する必要があります。lineReferenciaをオブジェクトのリストとして格納する必要があります。
  • これはいつか来るかもしれませんが、コードの英語名を維持しようとします。幅広い人に読めるようになりました。いつかそれは良い方法コードベースのサポート
+0

ええ、私はGUIやアイテムの生成方法を制御できないと言っていますが、値を割り当てる必要があります。すでにQt Created GUIのロジックを作成するだけです。 – Saelyth

+0

人生は難しいです:)できるだけこの経験から学びましょう – Slam

+0

これはまともなアプローチですが、フォーム要素の名前が変更されると自然に壊れてしまいます。また、 'getattr'ダンスを一度しかやっておかないと、フォーム要素のdictsのリストを集めることはできません。 – AKX

0

ために重要になることがあります。

オブジェクト指向はフィールドReferncia、Conceptoを持つオブジェクトの行を作成する必要があります必要があります...そして、あなたのメインクラスは、行のリストが含まれています。これはあなたの拡張バージョンと同じくらい速くなります。

Class Line: 
    def __init__(self, ......): 
     self.referencia = ..... 

Class Polygon: 
    def __init__(self): 
     self.lines =() 
     line1 = Line(.......) 
     self.lines.append(line1) 
     line2 = 

簡単な方法:インタプリタ言語

member_names = ("lineReferencia", "lineConcepto", "lineCantidad", "linePrecio", "lineDescuento") 
for i in range(4): 
    for member_name in member_names: 
     text_widdget = self.__dict__["lineReferencia" + str(i)] 
     i_register = 16 + member_names.index(member_name) + 7 * i 
     text_widget.setText(utilidades.ensure_its_str(registro[i_register])) 

の場合は、キーとして自分の名前と現在のオブジェクトのメンバ変数を含む辞書であるself.__dict__の使用に注意してください。

関連する問題