在我的 C#/ASP.NET 项目中,我有一个具有某些行为类别的对象。每个行为类别在物理上都依赖于一个根对象,但为了使代码更好地阅读,我想清楚地区分这些类别。我认为看看我的实现如何与其他人为解决相同问题而编写的实现进行比较会很有趣。
在下面的示例中,我有一个类可以生成网站上不同位置的 URL。该网站有一个店面,它有自己的一组链接,这些链接的访问方式应与主页等 URL 不同。
public class WebsiteURLs
{
// One category of urls on the website is the store.
public class StoreURLs
{
private WebsiteURLs _website;
public class StoreURLs(WebsiteURLs website)
{
_website = website;
}
public string BestSellers
{
get { return _website.ResolveURL("~/store/bestSellers.html"); }
}
}
private StoreURLs _store;
public StoreURLs Store // property for generating store urls
{
get
{
if (_store == null ) {
_store = new StoreURLs(this);
}
return _store;
}
}
public string Homepage
{
get { return ResolveURL("~/default.aspx"); }
}
// .. Other Categories Here
protected string ResolveURL(string url)
{
return HttpContext.Current.Response.ApplyAppPathModifier(url);
}
}
使用此代码将类似于以下内容
WebsiteURLs website;
Console.WriteLine(website.Store.BestSellers);
罗伯特:
该示例本身只是我发现自己试图更明确地组织功能的一种情况。你有没有发现自己在相关方法周围使用前缀。String.TrimStart()、String.TrimEnd()、String.Trim() 是从 C# 框架中想到的一个示例。
我试图组织上面的代码(从可读性的角度来看)受到嵌套类无法访问外部类成员的影响。构建内部类涉及额外的工作,因为我必须将 WebsiteURLs 实例的引用传递给 StoreURLs 类的构造函数,这几乎违反了 C# 编码实践,因为这种闭包行为不是嵌套类的行为语。我很好奇其他人在存在大量相关功能的情况下会使用什么 C# 代码(想想数十或数百种方法)。(注意:上面的代码在 Java 中编写起来更加流畅,其中嵌套类确实可以访问它们的外部类成员)。