我目前正在模拟RNA和RNA转录的一般形式,我很难找到合适的OO模型。
人RNA有4种核苷酸(A、G、U和C)。RNA链就是这四种类型中的一条。比如AAGACAUUCUA..。
我试图建立的模型更为通用,因为我希望能够在运行时决定核苷酸类型的数量。因此,我的对象模型需要能够表示任意数目的核苷酸类型。
最初,我想我应该有一个核苷酸类,它有一个int TypeId成员。这样,我就可以得到一系列任意类型的核苷酸实例.但这感觉不对。
我不太喜欢在变量中存储类型。我也不习惯在每个实例上设置定义信息(而不是在类中定义)。
那我怎么才能避开这一切呢?到目前为止,我想出的是:
是否有更好的,更多的OO,接近?
发布于 2013-08-26 15:18:20
如果一个核苷酸没有明显的行为,并且如果它的类型信息可以简洁地表示(例如,一个字符),那么它根本不应该有一个单独的类。只需将每个核苷酸表示为一个字符(或其他什么)。
但是,如果一个核苷酸有行为,那么我会用单核苷酸来建模,每个核苷酸类型都有一个实例。
由于核苷酸的行为没有差别,所以它们是简单的值对象。核苷酸实例应该是不可变的,因此给定类型的所有核苷酸都可以由单个实例表示。
我想使用核苷酸的符号作为它的类型,这将是核苷酸的唯一实例变量。
核苷酸工厂可以跟踪单例核苷酸实例,在请求新核苷酸类型时创建新实例,或者以其他方式返回现有实例。根据语言的不同,这个工厂可以方便地在核苷酸类的静态方法中实现。
发布于 2013-08-26 20:17:43
byte TypeId而不是int TypeId,因为当你用长的核苷酸列表制作RNA链时,你不会想浪费你真正需要的内存的4倍。TypeId应该是该结构的唯一成员。如果某些操作需要其他信息,请尝试使用飞重模式。因此,具有1000个元素的List<Nucleotide>将几乎精确地需要内存中的1000个字节,并且有可忽略的开销(在C#中)。发布于 2013-08-27 17:26:01
首先,我会尝试以下几种方法。
A、G、U和C都应该从基类nucleotide派生--它们是核苷酸表示的抽象类的特定实例。用面向对象建模的术语来说,"A是nucleotide“
这使你能够同时扩展所有4类核苷酸,或者仅仅是单个核苷酸。
需要另一个类来将Strand建模为一个由一系列核苷酸组成的链。"Strand有一个(列表) nucleotides“。您也可以扩展Strand类来执行链将负责但核苷酸不负责的操作。
我还添加了一个“以防万一”的接口。对于直接的使用,基类核苷酸类应该是足够的,但如果没有,则有一个接口来帮助保证行为。
同样,我在List中使用了一个Strand集合,所以在第一次建模时,我不必担心诸如链长度之类的细节。大多数OO语言应该有一个等效的泛型集合来使用。
class Program
{
static void Main(string[] args)
{
Strand myStrand = new Strand();
myStrand.Add(new A());
myStrand.Add(new G());
myStrand.Add(new U());
myStrand.Add(new C());
}
}
public interface INucleotide
{
}
public class Nucleotide : INucleotide
{
public byte TypeID;
}
public class A : Nucleotide {}
public class G : Nucleotide {}
public class U : Nucleotide {}
public class C : Nucleotide {}
public class Strand
{
private List<INucleotide> Nucleotides = new List<INucleotide>();
public void Add(INucleotide nuc)
{
Nucleotides.Add(nuc);
}
}上面的样本在C#中。
单身真的不适合这个建模练习-没有任何“单一”关于你要建模的东西。您可能会有许多A、G、U和C以及Strands的实例化。
https://softwareengineering.stackexchange.com/questions/209520
复制相似问题