当你在一个对象的构造函数中给一个参数并且该对象用参数填充它的字段时,这个模式被称为什么?
例如:
/// <summary>
/// Represents a user on the Dream.In.Code website.
/// </summary>
public class User
{
/// <summary>
/// Load a user by providing an ID.
/// </summary>
/// <param name="ID">A user's individual ID number.</param>
public User(string ID)
{
WebClient webClient = new WebClient();
string htmlSource = webClient.DownloadString(new Uri(String.Format("http://www.dreamincode.net/forums/xml.php?showuser={0}",ID)));
XDocument xml = XDocument.Parse(htmlSource);
var profileXML = xml.Element("ipb").Element("profile");
//Load general profile information.
this.ID = profileXML.Element("id").Value;
this.Name = profileXML.Element("name").Value;
this.Rating = profileXML.Element("rating").Value;
this.Photo = profileXML.Element("photo").Value;
this.Reputation = profileXML.Element("reputation").Value;
this.Group = profileXML.Element("group").Element("span").Value;
this.Posts = profileXML.Element("posts").Value;
this.PostsPerDay = profileXML.Element("postsperday").Value;
this.JoinDate = profileXML.Element("joined").Value;
this.ProfileViews = profileXML.Element("views").Value;
this.LastActive = profileXML.Element("lastactive").Value;
this.Location = profileXML.Element("location").Value;
this.Title = profileXML.Element("title").Value;
this.Age = profileXML.Element("age").Value;
this.Birthday = profileXML.Element("birthday").Value;
this.Gender = profileXML.Element("gender").Element("gender").Element("value").Value;
//Load contact information.
var contactXML = xml.Element("ipb").Element("profile").Element("contactinformation");
this.AIM = contactXML.XPathSelectElement("contact[title='AIM']/value").Value;
this.MSN = contactXML.XPathSelectElement("contact[title='MSN']/value").Value;
this.Website = contactXML.XPathSelectElement("contact[title='Website URL']/value").Value;
this.ICQ = contactXML.XPathSelectElement("contact[title='ICQ']/value").Value;
this.Yahoo = contactXML.XPathSelectElement("contact[title='Yahoo']/value").Value;
this.Jabber = contactXML.XPathSelectElement("contact[title='Jabber']/value").Value;
this.Skype = contactXML.XPathSelectElement("contact[title='Skype']/value").Value;
this.LinkedIn = contactXML.XPathSelectElement("contact[title='LinkedIn']/value").Value;
this.Facebook = contactXML.XPathSelectElement("contact[title='Facebook']/value").Value;
this.Twitter = contactXML.XPathSelectElement("contact[title='Twitter']/value").Value;
this.XFire = contactXML.XPathSelectElement("contact[title='Xfire']/value").Value;
//Load latest visitors.
var visitorXML = xml.Element("ipb").Element("profile").Element("latestvisitors");
this.Visitors = (from visitor in visitorXML.Descendants("user")
select new Visitor(){
ID = visitor.Element("id").Value,
Name = visitor.Element("name").Value,
Url = visitor.Element("url").Value,
Photo = visitor.Element("photo").Value,
Visited = visitor.Element("visited").Value,
}).ToList();
//Load friends.
var friendsXML = xml.Element("ipb").Element("profile").Element("friends");
this.Friends = (from friend in friendsXML.Descendants("user")
select new Friend()
{
ID = friend.Element("id").Value,
Name = friend.Element("name").Value,
Url = friend.Element("url").Value,
Photo = friend.Element("photo").Value
}).ToList();
//Load comments.
var commentsXML = xml.Element("ipb").Element("profile").Element("comments");
this.Comments = (from comment in commentsXML.Descendants("comment")
select new Comment()
{
ID = comment.Element("id").Value,
Text = comment.Element("text").Value,
Date = comment.Element("date").Value,
UserWhoPosted = new Friend()
{
ID = comment.Element("user").Element("id").Value,
Name = comment.Element("user").Element("name").Value,
Url = comment.Element("user").Element("url").Value,
Photo = comment.Element("user").Element("photo").Value
}
}).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
这种模式会被称为什么?另外,为了使我的代码更清晰,你建议我在对象中创建对象时使用这种模式,比如我的UserWhoPosted变量.而不是:
UserWhoPosted = new Friend()
{
ID = comment.Element("user").Element("id").Value,
Name = comment.Element("user").Element("name").Value,
Url = comment.Element("user").Element("url").Value,
Photo = comment.Element("user").Element("photo").Value
}
Run Code Online (Sandbox Code Playgroud)
我有:
UserWhoPosted = new Friend(myFriendXElementVariable);
Run Code Online (Sandbox Code Playgroud)
然后让它解析它需要的东西并填充它的字段.
感谢您的指导.
编辑:阅读完所有建议后,我清理了一下代码.你认为这更好吗?你会改进什么?
感谢您抽出宝贵的时间来帮助我,我试图抛弃糟糕的编程习惯.
对我而言,它更像是一种反模式:在构造函数中包含xml请求,读取和字段初始化.也许你可以像这样使用Factory模式:
public static class FactoryUser{
public static User GetUserFromXml(Xml){
//your code here
}
}
public static class UserWebrequester{
public static Xml GetXmlUser(id){
}
}
Run Code Online (Sandbox Code Playgroud)
也许你可以添加一些单例,以便能够对你的类进行单元测试.
| 归档时间: |
|
| 查看次数: |
370 次 |
| 最近记录: |