【发布时间】:2011-03-03 01:22:27
【问题描述】:
我正在制作一个开源 C# 库供其他开发人员使用。我最关心的是易用性。这意味着使用直观的名称、直观的方法用法等。
这是我第一次与其他人一起做某事,所以我真的很关心架构的质量。另外,我不介意学习一两件事。 :)
我有三个课程: 下载器、解析器和影片
我在想最好只公开我的库的 Movie 类,并让 Downloader 和 Parser 保持隐藏,不被调用。
最终,我看到我的库被这样使用了。
使用 FreeIMDB;
public void Test()
{
var MyMovie = Movie.FindMovie("The Matrix");
//Now MyMovie would have all it's fields set and ready for the big show.
}
您能否回顾一下我的计划,并指出我做出的任何错误判断以及我可以改进的地方。
记住,我主要关心的是易用性。
Movie.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace FreeIMDB
{
public class Movie
{
public Image Poster { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Rating { get; set; }
public string Director { get; set; }
public List<string> Writers { get; set; }
public List<string> Genres { get; set; }
public string Tagline { get; set; }
public string Plot { get; set; }
public List<string> Cast { get; set; }
public string Runtime { get; set; }
public string Country { get; set; }
public string Language { get; set; }
public Movie FindMovie(string Title)
{
Movie film = new Movie();
Parser parser = Parser.FromMovieTitle(Title);
film.Poster = parser.Poster();
film.Title = parser.Title();
film.ReleaseDate = parser.ReleaseDate();
//And so an so forth.
}
public Movie FindKnownMovie(string ID)
{
Movie film = new Movie();
Parser parser = Parser.FromMovieID(ID);
film.Poster = parser.Poster();
film.Title = parser.Title();
film.ReleaseDate = parser.ReleaseDate();
//And so an so forth.
}
}
}
Parser.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;
namespace FreeIMDB
{
/// <summary>
/// Provides a simple, and intuitive way for searching for movies and actors on IMDB.
/// </summary>
class Parser
{
private Downloader downloader = new Downloader();
private HtmlDocument Page;
#region "Page Loader Events"
private Parser()
{
}
public static Parser FromMovieTitle(string MovieTitle)
{
var newParser = new Parser();
newParser.Page = newParser.downloader.FindMovie(MovieTitle);
return newParser;
}
public static Parser FromActorName(string ActorName)
{
var newParser = new Parser();
newParser.Page = newParser.downloader.FindActor(ActorName);
return newParser;
}
public static Parser FromMovieID(string MovieID)
{
var newParser = new Parser();
newParser.Page = newParser.downloader.FindKnownMovie(MovieID);
return newParser;
}
public static Parser FromActorID(string ActorID)
{
var newParser = new Parser();
newParser.Page = newParser.downloader.FindKnownActor(ActorID);
return newParser;
}
#endregion
#region "Page Parsing Methods"
public string Poster()
{
//Logic to scrape the Poster URL from the Page element of this.
return null;
}
public string Title()
{
return null;
}
public DateTime ReleaseDate()
{
return null;
}
#endregion
}
}
-----------------------------------------------
你们认为我正在走向一条好的道路,还是我在为以后的伤害世界做好准备?
我最初的想法是将下载、解析和实际填充分开,以便轻松拥有一个可扩展的库。想象一下,如果有一天网站更改了它的 HTML,那么我只需要修改解析类,而无需触及 Downloader.cs 或 Movie.cs 类。
感谢您的阅读和帮助!
还有其他想法吗?
【问题讨论】:
-
看起来不错,您的解析器不解析任何内容,并且名称可能会产生误导。解析器实际上是一个 DAO(数据访问对象)我将其命名为 MovieDAO,而您的电影是一个实体(您可以不理会它)
-
解析器现在没有实际的解析代码。它的目的是接收 HTML 文档,然后抓取所有相关信息并将其保存到实例化的 Movie 对象中。 Title()、Poster() 等方法只是用来反弹在抓取时创建的 Movie 对象的字段。
-
然后我会有一个 Movie、MovieDAO、MovieParser 和一些控制器来处理它们之间的交互。也许将 Parser 作为参数传递给 DAO 进行构造或检索。
-
我也同意 FindMovie 和 FindKnownMovie 应该是一个重载,并通过参数来区分。这些方法应该移到 DAO(它是负责检索电影的对象。
标签: c# .net architecture