标题基本上已经说明了问题。您编写的接口使您感到自豪并且经常使用。我猜编写 IEnumerable<T>
和尤其是 IQueryable<T>
的人在创建它们后会有一种良好的感觉。
我对Push LINQ的界面设计感到满意。它是一个非常简单的界面,但是你可以用它做各种有趣的事情。下面是定义(从记忆中得出,但至少会非常接近):
public interface IDataProducer<T>
{
event Action<T> DataProduced;
event Action EndOfData;
}
IEnumerable
是整个.NET框架的关键接口。它无处不在。没有它就没有.NET。因此,要求一个“完美”的接口是否太过分了?为了进行MVP模式的工作,我有一些基本的框架接口:
public interface IValidatable {
bool IsValid { get; set; }
void ShowValidationFailureMessage(string message);
}
public interface ISubmitable {
event EventHandler Submit;
void ShowSubmitFailureMessage(string message);
void ShowSubmitSuccessMessage(string message);
}
public interface ICancelable {
event EventHandler Cancel;
}
通过这3个接口,我可以编写具有以下通用操作的Presenter(基本涵盖了所有表单操作)。例如:
public interface ILogin : IValidatable, ISubmitable, ICancelable {
string Username { get; set; }
string Password { get; set; }
}
接下来,您可以创建一个演示文稿并将其桩出。
我正在开发一个验证系统,计划很快发布给社区使用。它本质上是规范模式的实现。
核心接口的设计是以功能为导向的:
public interface ICheckable<T>
{
CheckResult Apply(T target);
}
CheckResult
是一个表示三状态值的 struct
: Passed
, Failed
, 和 Ignored
。已经设置了所有的转换和运算符重载,以将其视为 Boolean
值。
这使验证器可以表达“我没有意见”,而不是返回一个误导性的 true
值(比如 RangeValidator
表示空字段是有效的,因此它与 RequiredFieldValidator
相互协作)。
组合自然而然地完成,并使用静态类类似于 Linq。每个点进入检查是下一个操作的隐式 And
:
public static ICheckable<T> Add<T>(this ICheckable<T> check, ICheckable<T> otherCheck)
{
return new Check<T>(t => check.Apply(t) && otherCheck.Apply(t));
}
public static ICheckable<T> Either<T>(this ICheckable<T> check, ICheckable<T> firstCheck, ICheckable<T> secondCheck)
{
return check.Add(t => firstCheck.Apply(t) || secondCheck.Apply(t));
}
public static ICheckable<T> Not<T>(this ICheckable<T> check, ICheckable<T> negatedCheck)
{
return check.Add(t => !negatedCheck.Apply(t));
}
扩展方法非常好用:
public static ICheckable<int> Percentage(this ICheckable<int> check)
{
return check.Add(n => n >= 0 && n <= 100);
}
public static ICheckable<T> GreaterThanOrEqualTo<T>(this ICheckable<T> check, T value) where T : IComparable<T>
{
return check.Add(t => t.CompareTo(value) >= 0);
}
public static ICheckable<T> LessThanOrEqualTo<T>(this ICheckable<T> check, T value) where T : IComparable<T>
{
return check.Add(t => t.CompareTo(value) <= 0);
}
public static ICheckable<T> Range<T>(this ICheckable<T> check, T minimum, T maximum) where T : IComparable<T>
{
return check.GreaterThanOrEqualTo(minimum).LessThanOrEqualTo(maximum);
}
// RangeExcludeMinimum
// RangeExcludeMaximum
// RangeExclusive
每个操作都包括重载,其中包含一个用于构建检查的 lambda 函数:
public static ICheckable<T> Add<T>(this ICheckable<T> check, Func<ICheckable<T>, ICheckable<T>> makeCheck)
{
return check.Add(makeCheck(new IgnoredCheck<T>()));
}
所以你可以像这样编写语法:
ICheckable<int> check;
check.Add(i => i.Percentage().GreaterThan(50).Even());
这是一个ActionScript 3接口,它是我们为Flash Player的新行为在as3中的核心。
public interface IDisposable {
public function dispose():void;
}
正如您所期望的那样,dispose
方法应该关闭所有资源并丢弃任何可能的引用。
C++ 程序员可能会嘲笑这个“创新”的接口(这是完全可以理解的),但是 as3 在 Flash 中引入了许多与内存管理相关的问题。对于许多编译语言来说,这些问题都是老生常谈,但是 actionscript 程序员现在才第一次遇到这些挑战。
是的,它仍然是一种垃圾收集语言。但不管怎样,与 ActionScript 2 相比,这里有更少的“手把手指导”,正如此接口的需求所证明的那样。