首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何建模任意数量的类型

如何建模任意数量的类型
EN

Software Engineering用户
提问于 2013-08-26 14:45:17
回答 3查看 437关注 0票数 4

我目前正在模拟RNA和RNA转录的一般形式,我很难找到合适的OO模型。

人RNA有4种核苷酸(A、G、U和C)。RNA链就是这四种类型中的一条。比如AAGACAUUCUA..。

我试图建立的模型更为通用,因为我希望能够在运行时决定核苷酸类型的数量。因此,我的对象模型需要能够表示任意数目的核苷酸类型。

最初,我想我应该有一个核苷酸类,它有一个int TypeId成员。这样,我就可以得到一系列任意类型的核苷酸实例.但这感觉不对。

我不太喜欢在变量中存储类型。我也不习惯在每个实例上设置定义信息(而不是在类中定义)。

那我怎么才能避开这一切呢?到目前为止,我想出的是:

  • 在以前的项目中,我们将有Singleton对象,它表示另一个对象的类型。另一个对象将简单地引用单例,就是它。它阻止了我们对类型的“定义”进行多次实例化。不太好海事组织。
  • 我记得实体框架在运行时生成动态代理。我可以做些类似的事。我可以有一个NucleotideBase基类,并在运行时定义派生类。我相信这是可能的,通过反思。我不知道这种方法对性能有什么影响,但我假设定义类时只需要一次开销。

是否有更好的,更多的OO,接近?

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2013-08-26 15:18:20

如果一个核苷酸没有明显的行为,并且如果它的类型信息可以简洁地表示(例如,一个字符),那么它根本不应该有一个单独的类。只需将每个核苷酸表示为一个字符(或其他什么)。

但是,如果一个核苷酸有行为,那么我会用单核苷酸来建模,每个核苷酸类型都有一个实例。

由于核苷酸的行为没有差别,所以它们是简单的值对象。核苷酸实例应该是不可变的,因此给定类型的所有核苷酸都可以由单个实例表示。

我想使用核苷酸的符号作为它的类型,这将是核苷酸的唯一实例变量。

核苷酸工厂可以跟踪单例核苷酸实例,在请求新核苷酸类型时创建新实例,或者以其他方式返回现有实例。根据语言的不同,这个工厂可以方便地在核苷酸类的静态方法中实现。

票数 11
EN

Software Engineering用户

发布于 2013-08-26 20:17:43

  • 我会使用byte TypeId而不是int TypeId,因为当你用长的核苷酸列表制作RNA链时,你不会想浪费你真正需要的内存的4倍。TypeId应该是该结构的唯一成员。如果某些操作需要其他信息,请尝试使用飞重模式。因此,具有1000个元素的List<Nucleotide>将几乎精确地需要内存中的1000个字节,并且有可忽略的开销(在C#中)。
  • 如果您不期望不同的核苷酸类型有不同的行为,我觉得用不同的派生类来表示这些类型是完全错误的。不要让事情过于复杂--仅仅因为不同的派生类在技术上可以用于区分类型,它并不总是最好的解决方案。
票数 3
EN

Software Engineering用户

发布于 2013-08-27 17:26:01

首先,我会尝试以下几种方法。

AGUC都应该从基类nucleotide派生--它们是核苷酸表示的抽象类的特定实例。用面向对象建模的术语来说,"Anucleotide

这使你能够同时扩展所有4类核苷酸,或者仅仅是单个核苷酸。

需要另一个类来将Strand建模为一个由一系列核苷酸组成的链。"Strand有一个(列表) nucleotides“。您也可以扩展Strand类来执行链将负责但核苷酸不负责的操作。

我还添加了一个“以防万一”的接口。对于直接的使用,基类核苷酸类应该是足够的,但如果没有,则有一个接口来帮助保证行为。

同样,我在List中使用了一个Strand集合,所以在第一次建模时,我不必担心诸如链长度之类的细节。大多数OO语言应该有一个等效的泛型集合来使用。

代码语言:javascript
复制
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#中。

单身真的不适合这个建模练习-没有任何“单一”关于你要建模的东西。您可能会有许多AGUC以及Strands的实例化。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/209520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档