Progettazione OOP: definizione di set di regole aggiuntivi e scelta dinamica

-1

Come posso definire alcune regole o effetti aggiuntivi di un'azione e selezionarla dinamicamente?

Ad esempio, immaginiamo un FinancialProduct , che può essere un Share o un Bond , ciascuno con un Hedge . Ora mentre ci sono diversi tipi diversi di Hedge , il loro numero è ancora finito e conosciuto in anticipo, è solo l'associazione Hedge / FinancialProduct che può essere scelta in fase di esecuzione (ma anche la creazione di nuovi set di regole in fase di esecuzione può essere interessante , ma una domanda alla volta).

Come potrei implementare questo tipo di comportamento?

Se il business Hedge è implementato in una classe diversa, come può sapere FinancialProduct proprietà e eventualmente modificarle, ad esempio? O modificare una proprietà da una classe diversa (un Portfolio che contiene un elenco di proprietà o disponibili FinancialProducts per esempio?)

    
posta Ythio Csi 13.06.2017 - 10:14
fonte

1 risposta

0

Innanzitutto, vorrei iniziare dicendo. Avere una classe base FinacialProduct è una ricetta per il disastro. Se si pensa a opzioni, obbligazioni e azioni, in realtà non hanno molto in comune. L'unica cosa che hanno in comune sono le cose che puoi fare a loro, come essere comprati, venduti, ecc. Per abilitare il polimorfismo in questi comportamenti comuni, è necessario definire le interfacce: ICanBeBought, ICanBeSold, ICanCheckIfAllowedToBeSold, ICanBeHedged, ect. Se hai una classe base di FincialProduct, dovrebbe essere ridotta a solo avere una proprietà FincialProductType.

Una copertura è fondamentalmente solo un collegamento tra due prodotti finanziari:

public class Hedge
{
      private IDynamicStrategy Rule {get; set;}//Change the rules dynamically here
      public DateTime CreateDate {get;set;}
      public ICanBeHedged Product1 {get;set;}
      public ICanBeHedged Product2 {get;set;}
      //The Hedge class knows about both of its financial products because it has references to them.

     public bool FollowsDynamicRules()
     {
         return Rule.IsAllowed(Product1, Product2);
     } 
}

public class Bond : ICanBeHedged, ICanBeBought, ICanBeSold
{
     public bool CanIDoSomething(Hedge parentHedge)
     {
         //Now I know about my parent hedge where I need to! However, I don't have a reference to my parent hedge defined as a field/property because it is not a inherent part of me. Maybe I don't need to know about a hedge at all and this belongs in the Hedge class?
     }
}
    
risposta data 13.06.2017 - 17:26
fonte