2011-02-13 8 views
1

.net:このコードを最適化する方法?

private sub test 
     Call PopulateColorsWithMasterIdentity(Colors, Id) 
     Call PopulatePartsWithMasterIdentity(Parts, Id) 
     Call PopulateSaloonsWithMasterIdentity(Saloons, Id) 
End sub 

Private Sub PopulateColorsWithMasterIdentity(ByRef MyList As List(Of entclsCriticalPartSetColor), ByVal Id As Integer) 

    For index As Byte = 0 To MyList.Count - 1 
     MyList.Item(index).CriticalPartsSetId = Id 
    Next 
End Sub 

Private Sub PopulatePartsWithMasterIdentity(ByRef MyList As List(Of entclsCriticalPartSetPart), ByVal Id As Integer) 

    For index As Byte = 0 To MyList.Count - 1 
     MyList.Item(index).CriticalPartsSetId = Id 
    Next 
End Sub 

Private Sub PopulateSaloonsWithMasterIdentity(ByRef MyList As List(Of entclsCriticalPartSetSaloon), ByVal Id As Integer) 

    For index As Byte = 0 To MyList.Count - 1 
     MyList.Item(index).CriticalPartsSetId = Id 
    Next 
End Sub 

* EDIT実際 *

.....私は/最適化し、このコードをリファクタリング助けてください、それが "多型" を使用することは可能ですか?私の代わりにpopulateXXXWithMasterIdentityの3つの異なる部分を有するので、私はこの1つのような1 PopulateListWithMasterIdentityを持つことができ、意味:

Private Sub PopulateListWithMasterIdentity(MyList As IList(Of entclsCriticalPartsBase), Id As Integer) 
    ..... 
End Sub 

はあなたがすべてのオブジェクトを変異されているアップデートで

+3

このコードはどのような問題を解決しようとしていますか?それをリファクタリングする動機は何ですか? – Sapph

+0

@Sapph、私は自分の投稿を編集したばかりです:3の代わりに1つのPopulateXXXをどうすればできますか? – odiseh

答えて

2

まず、あなたが使用するすべての三種類に共通するプロパティCriticalPartsSetIdが含まインタフェース宣言:

Public Interface IHasCriticalPartsSetId 
    Property CriticalPartsSetId As Integer 
End Interface 

をことを確認します3つの異なるタイプがこのインタフェースを実装します。あなたが実際にジェネリック型を使用する必要があります場合、私は期待通りIEnumerable(Of IHasCriticalPartsSetId)が機能するかどうかはかなりわからない、あるいは今

Sub PopulateId(xs As IEnumerable(Of IHasCriticalPartsSetId), id As Integer) 
    For Each x in xs 
     x.CriticalPartsSetId = id 
    Next 
End Sub 

次に、CriticalPartsSetIdプロパティを更新1つのメソッドを書きますVB.NETのMarc Gravellの答え—に示されているように、パラメータの制約があります。IEnumerable(Of T As IHasCriticalPartsSetId)です。

別の完全に無関係の最適化にも注意してください。ループを取り除き、Byteカウンタを使用します。 For Eachループを使用すると、コードを読みやすくなります。 (Byteタイプのカウンタ変数を使用すると、実際にInteger型変数を使用する場合よりもパフォーマンスが悪化する可能性があります。は、(IIRC)Byteサイズの数値を内部実行スタックに置くときに、Integerサイズの値に展開します。

+0

@staks、IEnumerableまたはIList?すべての3つのサブは、1つのパラメータを一般的なリストとして持っています。 – odiseh

+1

* @ odiseh *、私は目的に応じてIEnumerableを選択しました。これは2つのタイプがあまりにも「厳しい」タイプであり、実際にはメソッドの機能には十分です。つまり、 'IEnumerable'は' IList'よりも呼び出し側からの要求が少なく、メソッド(具体的には 'For Each'ループ)は' IEnumerable'だけを必要とします。したがって、 'IEnumerable'を選択することによって、メソッドは' IList'を選択した場合よりも多目的になります。 – stakx

+0

@staks:たくさんありがとうございます – odiseh

2

ありがとうございました。 O(n)よりも優れているわけではありません。すでにO(n)です。最適化は必要ありません。リファクタとして、私はByRefを取り去ります - あなたはそれを使用していません。また、共通の基底クラスまたはインタフェースを検討し、3つすべてが1つの汎用メソッドを共有することもできます。 C#の用語では:

interface IFoo { 
    int CriticalPartsSetId {get;set;} 
} 
public static void UpdateCriticalPartsSetId<T>(
    IEnumerable<T> items, int criticalPartsSetId) 
    where T : IFoo 
{ 
    foreach(var item in items) 
     item.CriticalPartsSetId = criticalPartsSetId; 
} 
3

あなたは本当にこのコードを最適化することはできませんが、Itemプロパティ呼び出しが完全に冗長であるので、あなたはそれが少しより簡潔にすることができます。

さらに、リストに255を超える要素がない場合でも、インデックス変数にはByteタイプを使用しないでください。意味がありません。ここでは常にIntegerを使用してください(または、コンパイラにOption Infer Onを使用して型を推測させる)。次のように

代わりに、ループを書く:

For index As Integer = 0 To MyList.Count - 1 
    MyList(index).CriticalPartsSetId = Id 
Next 
0

多形性の質問に答えるには、可能です。しかし、あなたは本当に必要はありません。これらの3つのクラスはすべて共通のプロパティ(CriticalPartsSetId)を共有しているため、それらを基本クラスに置き、それらのすべてを継承させることができます。ポリモーフィズムでは、サブクラスで何かを変えることができますが、この場合、CriticalPartsSetIdは同じことをするので、必要ではありません。

あなたはここに3つのリストを持っていますか?あなたはSETIDがセット自体の一部であり、それを変更する代わりに、3つのリスト上の反復の単一の操作で、それを行う場合

Public Class CriticalPartsSet 

    Public Property SetId as Integer 
    Public Property SetColors as List(of entclsCriticalPartSetColor) 
    Public Property SetParts as List(of entclsCriticalPartSetPart) 
    Public Property SetSaloons as List(of entclsCriticalPartSetSaloon) 

End Class 

:多分それはこのような何かをするより多くの意味を作ると思います。また、セット全体とそれに関するすべてを、それを必要とするメソッドへの単一のパラメータとして渡すこともできます。これは便利です。 :)

(最後に、ByRefを削除してByValを使用する必要があります。ByRefを使用すると、リストがまったく別のリストに置き換えられ、呼び出し元が新しいリストを取得できるようになります。 ByValを使ってリスト内のものを修正することができます。後で意図しない奇妙さが生じる可能性は低くなります。)

関連する問題