C# 您将如何实现?:C中树上的许多规则#

C# 您将如何实现?:C中树上的许多规则#,c#,tree,design-patterns,rules,traversal,C#,Tree,Design Patterns,Rules,Traversal,我有一个表示C代码的数据结构,如下所示: class Namespace: string Name; List<Class> Classes; class Class: string Name; List<Property> Properties; List<Method> Methods; List<Method> Constructors; List<Field> Field

我有一个表示C代码的数据结构,如下所示:

class Namespace:
    string Name;
    List<Class> Classes;

class Class:
    string Name;
    List<Property> Properties;
    List<Method> Methods;
    List<Method> Constructors;
    List<Field> Fields;
    List<Class> InnerClasses;
    Class Parent;
    List<Interface> Implements;
类名称空间:
字符串名;
列出课程;
类别:
字符串名;
列出财产;
列出方法;
列出施工人员名单;
列表字段;
列出内部类;
班级家长;
清单实施;
。。。我正在使用一个简单的lexer/parser组合构建它。我需要遍历树并应用大量规则(超过3000条)。当在树中遇到不同(且相当复杂)的模式时,规则会运行。例如,当一个类只在同一程序集中实现接口时,会运行一条规则

我最初的天真实现迭代每个规则,然后每个规则遍历树,寻找其特定的模式。当然,这需要相当多的时间,即使只有少量的源代码

我想这可以比作防病毒软件的工作原理,识别大量二进制代码上的复杂模式

您建议如何实现这种软件

EDT:我想补充一句:不,我没有重新实现FxCop


谢谢

您可以尝试汇总3000条规则。3000人中的一些人,我猜是3000人中的另一个。假设规则12检查“类实现接口”。第85条可能是 “类仅在同一程序集中实现接口”。如果规则12失败,则根本不需要运行规则85

这种方法(alpha-beta剪枝)要么需要重新构造算法来搜索类树,同时查找所有规则模式。或者隐藏一条记录,表明前一个规则过程已识别当前规则过程不相关

评论:我有一个nub级别的帐户,所以我不能直接评论。你能举一个例子,再举两条规则吗?我现在认为你的算法是0(n*n)(下面是从一个大的0符号帖子复制的)

O(n*log(n)):执行某种分治策略的算法。大的;大的。典型示例:合并排序


O(n*n):某种嵌套循环。即使是小伤口也会痛。与原始矩阵计算相同。如果你能避免这种算法,

我会考虑为模式/上下文创建某种表示,然后创建从模式到操作集的哈希映射。如果不了解更多的需求,就很难更加具体,但是作为一个例子,字符串
“Namespace/Class”
可能是一组操作的关键,这些操作依赖于了解名称空间及其包含的单个类
“Class/Interface”
可以是处理单个类及其实现的单个接口等的一组操作的键

树遍历算法可以跟踪自己的上下文(父节点、当前节点等),根据密钥在树中的位置形成密钥,检索该密钥的操作集,然后触发所有这些操作,为每个操作提供一个参数结构,该结构提供与密钥模式对应的实际节点

这相当于创建一个特殊用途的规则引擎,该引擎处理“如果我有一个类
C
,它实现了一个接口
I
,然后使用
C
I
”形式的规则

这是一个很好的方法。阿尔法-贝塔修剪你说它叫什么?这是重新安排规则,这样如果一个失败了,它就会排斥其他人。我说得对吗?我要调查一下

以下是其他规则的一些示例:

  • 类是final,不在程序集之外实现/扩展类
  • 方法是虚拟的,但类是私有的或内部的
  • 类或方法具有特定属性
  • 方法参数在编译时已知
我很想听到任何其他技术,可以让我更快/更智能地执行这种逻辑

谢谢