如果您对如何消除重复的Enum代码?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于如何消除重复的Enum代码?的详细内容,我们还将为您解答怎么删除重复代码的相关问题,并且为
如果您对如何消除重复的Enum代码?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于如何消除重复的Enum代码?的详细内容,我们还将为您解答怎么删除重复代码的相关问题,并且为您提供关于c# – 如何在我的操作中删除重复的代码?、c# – 如何避免重复的接口代码?、centos下如何清除重复的$PATH变量值、C编译器可以自动消除重复的代码吗?的有价值信息。
本文目录一览:- 如何消除重复的Enum代码?(怎么删除重复代码)
- c# – 如何在我的操作中删除重复的代码?
- c# – 如何避免重复的接口代码?
- centos下如何清除重复的$PATH变量值
- C编译器可以自动消除重复的代码吗?
如何消除重复的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); }
但这实际上是没有用的,因为:
- 枚举不能扩展类
- 枚举的元素(SKYPE,GOOGLE_TALK等)无法扩展类
- 我无法提供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# – 如何在我的操作中删除重复的代码?
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>()); }
通常我需要访问视图中的对象.此特定代码仅用于一个控制器,但我可能需要在具有不同对象和视图的其他控制器中使用类似的代码.
解决方法
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# – 如何避免重复的接口代码?
例如:
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的抽象基类并添加非抽象成员是一个解决方案.但是,如果我真的想真的要使用一个界面呢?
解决方法
分享逻辑的另一种方法是创建一个内部的“助手”类.这在您的情况下看起来是正确的选择:实现可以将内部共享代码调用为助手的方法,而不需要复制任何代码.例如:
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变量值
运行:
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编译器可以检测重复代码并且只发出一次相应的机器代码而不是源文本中的每个副本?
解决方法
从LLVM优化页面:-mergefunc(MergeFunctions pass,how it works)
这些函数在LLVM中间表示中以小块分隔,此优化过程尝试合并类似的块.但是不能保证成功.
您会在此页面上找到许多其他优化,即使其中一些可能在第一眼看上去很神秘.
我会添加一个注释,重复的代码对于编译器/可执行文件来说并不是那么糟糕,从维护的角度来看它是坏的,并且编译器无法做到这一点.
关于如何消除重复的Enum代码?和怎么删除重复代码的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于c# – 如何在我的操作中删除重复的代码?、c# – 如何避免重复的接口代码?、centos下如何清除重复的$PATH变量值、C编译器可以自动消除重复的代码吗?等相关内容,可以在本站寻找。
本文标签: