GVKun编程网logo

如何消除重复的Enum代码?(怎么删除重复代码)

15

如果您对如何消除重复的Enum代码?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于如何消除重复的Enum代码?的详细内容,我们还将为您解答怎么删除重复代码的相关问题,并且为

如果您对如何消除重复的Enum代码?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于如何消除重复的Enum代码?的详细内容,我们还将为您解答怎么删除重复代码的相关问题,并且为您提供关于c# – 如何在我的操作中删除重复的代码?、c# – 如何避免重复的接口代码?、centos下如何清除重复的$PATH变量值、C编译器可以自动消除重复的代码吗?的有价值信息。

本文目录一览:

如何消除重复的Enum代码?(怎么删除重复代码)

如何消除重复的Enum代码?(怎么删除重复代码)

我有很多实现此接口的枚举:

/** * Interface for an enumeration, each element of which can be uniquely identified by its code */public interface CodableEnum {    /**     * Get the element with a particular code     * @param code     * @return     */    public CodableEnum getByCode(String code);    /**     * Get the code that identifies an element of the enum     * @return     */    public String getCode();}

一个典型的例子是:

public enum IMType implements CodableEnum {    MSN_MESSENGER("msn_messenger"),    GOOGLE_TALK("google_talk"),    SKYPE("skype"),    YAHOO_MESSENGER("yahoo_messenger");    private final String code;    IMType (String code) {        this.code = code;    }    public String getCode() {        return code;    }    public IMType getByCode(String code) {        for (IMType e : IMType.values()) {            if (e.getCode().equalsIgnoreCase(code)) {                return e;            }        }    }}

可以想象,这些方法在CodableEnum的所有实现中实际上是相同的。我想消除这种重复,但坦率地说不知道如何做。我尝试使用如下类:

public abstract class DefaultCodableEnum implements CodableEnum {    private final String code;    DefaultCodableEnum(String code) {        this.code = code;    }    public String getCode() {        return this.code;    }    public abstract CodableEnum getByCode(String code);  }

但这实际上是没有用的,因为:

  1. 枚举不能扩展类
  2. 枚举的元素(SKYPE,GOOGLE_TALK等)无法扩展类
  3. 我无法提供getByCode()的默认实现,因为DefaultCodableEnum本身不是枚举。我尝试更改DefaultCodableEnum以扩展java.lang.Enum,但这似乎是不允许的。

有没有不依靠反思的建议?谢谢唐

答案1

小编典典

您可以将重复的代码分解为一个CodeableEnumHelper类:

public class CodeableEnumHelper {    public static CodeableEnum getByCode(String code, CodeableEnum[] values) {        for (CodeableEnum e : values) {            if (e.getCode().equalsIgnoreCase(code)) {                return e;            }        }        return null;    }}

每个CodeableEnum类仍然必须实现一个getByCode方法,但是该方法的实际实现至少已集中到一个地方。

public enum IMType implements CodeableEnum {    ...    public IMType getByCode(String code) {        return (IMType)CodeableEnumHelper.getByCode(code, this.values());    } }

c# – 如何在我的操作中删除重复的代码?

c# – 如何在我的操作中删除重复的代码?

我在mvc应用程序中重复了几次以下代码.

public ActionResult AnAction(int Id)
    {           
        var claim = GetClaim(Id);
        if (claim == null)
        {
            return View("ClaimNotFound");
        }

        // do stuff here
        ....
        return ....;
    }

到目前为止,这种模式使用了4次,而且变得越来越难看.重构它的最佳方法是什么?

编辑:
几个示例用法

public ActionResult Claim(int Id)
    {           
        var claim = GetClaim(Id);
        if (claim == null)
        {
            return View("ClaimNotFound");
        }

        return View("Claim",claim);
    }

    public ActionResult MedicalPV(int Id)
    {
        var claim = GetClaim(Id);
        if (claim == null)
        {
            return View("ClaimNotFound");
        }

        return PartialView(claim.MedCerts.AsQueryable<MedCert>());
    }

通常我需要访问视图中的对象.此特定代码仅用于一个控制器,但我可能需要在具有不同对象和视图的其他控制器中使用类似的代码.

解决方法

如果所有操作都需要声明,那么您可以尝试在OnActionExecuting中检索它,并在失败时将Result设置为ViewResult.如果只是某些操作,可能需要它,在执行方法之前检查以确保声明可用的ActionFilter,如果没有,则设置正确的视图.

private Claim Claim { get; set; }

public override void OnActionExecuting( ActionExecutingContext context )
{
    this.Claim = GetClaim( int.Parse( context.RouteData["id"] ) );
    if (this.Claim == null)
    {
        context.Result = View( "ClaimNotFound" );
    }
}

要么

public class RequiresClaimIdAttribute : ActionFilterattribute
{
    public override void OnActionExecuting( ActionExecutingContext context )
    {
         var claim = GetClaim( int.Parse( context.RouteData["id"] ) );
         if (claim == null)
         {
              context.Result = new ViewResult
              {
                   ViewName = "ClaimNotFound",ViewData = context.Controller.ViewData
              };
         }
         else
         {

              var property = context.Controller
                                    .GetType()
                                    .GetProperty( "Claim",BindingFlags.Public
                                                   | BindingFlags.NonPublic
                                                   | BindingFlags.Instance);
              if (property != null)
              {
                   property.SetValue(context.Controller,claim);
              }
         }
    }
}

[RequiresClaimId]
public ActionResult AnAction( int id )
{
    this.Claim.Updated = DateTime.Now;
    ...
}

c# – 如何避免重复的接口代码?

c# – 如何避免重复的接口代码?

由于接口不能包含实现,这似乎在导致从接口继承的类中的代码重复.在下面的例子中,假设,假设从Stream中读取的前10行或以上行被重复.尽量不要专注于这里的措辞,而是专注于在每个类之间创建重复代码的简单方法.

例如:

public interface IDatabaseProcessor
{
   void ProcessData(Stream stream);
}
public class sqlServerProcessor : IDatabaseProcessor
{
    void ProcessData(Stream stream)
    {
      // setting up logic to read the stream is duplicated code
    }
}
public class DB2Processor : IDatabaseProcessor
{
    void ProcessData(Stream stream)
    {
      // setting up logic to read the stream is duplicated code
    }
}

我意识到使用ProcessData的抽象基类并添加非抽象成员是一个解决方案.但是,如果我真的想真的要使用一个界面呢?

解决方法

跨接口共享代码的最佳方法是通过无状态扩展方法.您可以一次构建这些扩展,并在实现接口的所有类中使用它,而不管它们的继承链.这是.NET对IEnumerable< T>在LINQ中,取得了令人印象深刻的成果.这个解决方案并不总是可行的,但你应该喜欢它.

分享逻辑的另一种方法是创建一个内部的“助手”类.这在您的情况下看起来是正确的选择:实现可以将内部共享代码调用为助手的方法,而不需要复制任何代码.例如:

internal static class sqlProcessorHelper {
    public void StreamSetup(Stream toSetUp) {
        // Shared code to prepare the stream
    }
}
public class sqlServerProcessor : IDatabaseProcessor {
    void ProcessData(Stream stream) {
        sqlProcessorHelper.StreamSetup(stream);
    }
}
public class DB2Processor : IDatabaseProcessor {
    void ProcessData(Stream stream) {
        sqlProcessorHelper.StreamSetup(stream);
    }
}

助手类不需要是静态的:如果你的共享方法需要状态,你可以让你的帮助器成为一个普通的类,并在你想要共享代码的界面的每个实现中放置一个实例.

centos下如何清除重复的$PATH变量值

centos下如何清除重复的$PATH变量值

运行:

vim /etc/profile

添加如下代码:

awk -F: ''{
    sep = ""
    for (i = 1; i <= NF; ++i)
        if (unique[$i] != 1)
        {
            out = out sep $i
            sep = ":"
            unique[$i] = 1
        }
    print out
}'' <<< $PATH

 

运行:

source /etc/profile

 

C编译器可以自动消除重复的代码吗?

C编译器可以自动消除重复的代码吗?

代码重复 is usually bad并且通常很容易发现.我想编译器可以在最简单的情况下自动检测它 – 它们已经解析了文本并获得了他们以各种方式分析的中间表示 – 检测可疑模式,如未初始化的变量,优化发出的代码等等.我猜他们经常可以检测到功能重复以这种方式编码并在发出机器代码时对其进行说明.

是否有C编译器可以检测重复代码并且只发出一次相应的机器代码而不是源文本中的每个副本?

解决方法

有些人有,有些则没有.

从LLVM优化页面:-mergefunc(MergeFunctions pass,how it works)

这些函数在LLVM中间表示中以小块分隔,此优化过程尝试合并类似的块.但是不能保证成功.

您会在此页面上找到许多其他优化,即使其中一些可能在第一眼看上去很神秘.

我会添加一个注释,重复的代码对于编译器/可执行文件来说并不是那么糟糕,从维护的角度来看它是坏的,并且编译器无法做到这一点.

关于如何消除重复的Enum代码?怎么删除重复代码的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于c# – 如何在我的操作中删除重复的代码?、c# – 如何避免重复的接口代码?、centos下如何清除重复的$PATH变量值、C编译器可以自动消除重复的代码吗?等相关内容,可以在本站寻找。

本文标签: