重构代码以反映继承层次结构
Refactoring Code to reflect inheritance heirarchy
我正在尝试重构代码,但由于我对编程还很陌生,所以不知道从哪里开始。
我试过在 class CommentedPost 下添加方法注释,like 和 unlike,但不知道该怎么做。
Post.java
public class Post {
private String username; // username of the post's author
private long timestamp;
private int likes;
private ArrayList<String> comments;
/**
* Constructor for objects of class Post.
*
* @param author The username of the author of this post.
*/
public Post(String author)
{
username = author;
timestamp = System.currentTimeMillis();
likes = 0;
comments = new ArrayList<String>();
}
/**
* Record one more 'Like' indication from a user.
*/
public void like()
{
likes++;
}
/**
* Record that a user has withdrawn his/her 'Like' vote.
*/
public void unlike()
{
if (likes > 0) {
likes--;
}
}
/**
* Add a comment to this post.
*
* @param text The new comment to add.
*/
public void addComment(String text)
{
comments.add(text);
}
/**
* Return the time of creation of this post.
*
* @return The post's creation time, as a system time value.
*/
public long getTimeStamp()
{
return timestamp;
}
/**
* Display the details of this post.
*
* (Currently: Print to the text terminal. This is simulating display
* in a web browser for now.)
*/
public void display()
{
System.out.println(username);
System.out.print(timeString(timestamp));
if(likes > 0) {
System.out.println(" - " + likes + " people like this.");
}
else {
System.out.println();
}
if(comments.isEmpty()) {
System.out.println(" No comments.");
}
else {
System.out.println(" " + comments.size() + " comment(s). Click here to view.");
}
}
/**
* Create a string describing a time point in the past in terms
* relative to current time, such as "30 seconds ago" or "7 minutes ago".
* Currently, only seconds and minutes are used for the string.
*
* @param time The time value to convert (in system milliseconds)
* @return A relative time string for the given time
*/
private String timeString(long time)
{
long current = System.currentTimeMillis();
long pastMillis = current - time; // time passed in milliseconds
long seconds = pastMillis/1000;
long minutes = seconds/60;
if(minutes > 0) {
return minutes + " minutes ago";
}
else {
return seconds + " seconds ago";
}
}
}
评论Post.java
public class CommentedPost extends Post {
public CommentedPost(String author) {
super(author);
// TODO Auto-generated constructor stub
}
}
事件Post.java
public class EventPost extends Post{
public EventPost(String author) {
super(author);
// TODO Auto-generated constructor stub
}
}
留言Post.java
public class MessagePost extends Post{
private String message; // an arbitrarily long, multi-line message
/**
* Constructor for objects of class MessagePost.
*
* @param author The username of the author of this post.
* @param text The text of this post.
*/
public MessagePost(String author, String text)
{
super(author);
message = text;
}
/**
* Return the text of this post.
*
* @return The post's message text.
*/
public String getText()
{
return message;
}
/**
* Display the details of this post.
*
* (Currently: Print to the text terminal. This is simulating display
* in a web browser for now.)
*/
public void display()
{
super.display();
System.out.println(message);
}
}
StartNetwork.java
public class StartNetwork{
/**
* @param args
*/
public static void main( String[] args )
{
MessagePost message = new MessagePost("White Rabbit", "Oh dear, oh dear, I shall be late!");
PhotoPost photo = new PhotoPost("Alice Wonderland", "RabbitHole.jpg" ,"Down the rabbit hole :)");
message.addComment( "Your watch is exactly two days slow." );
photo.like();
NewsFeed news = new NewsFeed();
news.addPost( message );
news.addPost( photo );
news.show();
}
}
照片Post.java
public class PhotoPost extends Post{
private String filename; // the name of the image file
private String caption; // a one line image caption
/**
* Constructor for objects of class PhotoPost.
*
* @param author The username of the author of this post.
* @param filename The filename of the image in this post.
* @param caption A caption for the image.
*/
public PhotoPost(String author, String filename, String caption)
{
super(author);
this.filename = filename;
this.caption = caption;
}
/**
* Return the file name of the image in this post.
*
* @return The post's image file name.
*/
public String getImageFile()
{
return filename;
}
/**
* Return the caption of the image of this post.
*
* @return The image's caption.
*/
public String getCaption()
{
return caption;
}
/**
* Display the details of this post.
*
* (Currently: Print to the text terminal. This is simulating display
* in a web browser for now.)
*/
public void display()
{
super.display();
System.out.println(" [" + filename + "]");
System.out.println(" " + caption);
}
}
NewsFeed.java
public class NewsFeed{
private ArrayList<Post> posts;
/**
* Construct an empty news feed.
*/
public NewsFeed()
{
posts = new ArrayList<Post>();
}
/**
* Add a post to the news feed.
*
* @param post The post to be added.
*/
public void addPost(Post post)
{
posts.add(post);
}
/**
* Show the news feed. Currently: print the news feed details
* to the terminal. (To do: replace this later with display
* in web browser.)
*/
public void show()
{
// display all posts
for(Post post : posts) {
post.display();
System.out.println(); // empty line between posts
}
}
}
重构后的代码应该有一个 class 图表,其中包含以下内容:
Post w/字段用户名和时间戳
已评论Post(指向Post 的箭头,即从它继承)w/字段喜欢和评论
EventPost(箭头指向 Post)w/字段 eventType
消息Post(箭头指向已评论Post)w/字段消息
照片Post(箭头指向评论Post)w/字段文件名和标题
Post 包含点赞和评论。您应该将这些字段移动到 CommentedPost.
我不确定字段 eventType 是什么,但是 EventPost 没有这样的字段。你应该创建它。
根据您的描述,MessagePost 应该扩展 CommentedPost。它不是;相反,它扩展了 Post。您应该更改它,使其扩展 CommentedPost.
根据您的描述,PhotoPost 应该扩展 CommentedPost。它不是;相反,它扩展了 Post。您应该更改它,使其扩展 CommentedPost.
我正在尝试重构代码,但由于我对编程还很陌生,所以不知道从哪里开始。
我试过在 class CommentedPost 下添加方法注释,like 和 unlike,但不知道该怎么做。
Post.java
public class Post {
private String username; // username of the post's author
private long timestamp;
private int likes;
private ArrayList<String> comments;
/**
* Constructor for objects of class Post.
*
* @param author The username of the author of this post.
*/
public Post(String author)
{
username = author;
timestamp = System.currentTimeMillis();
likes = 0;
comments = new ArrayList<String>();
}
/**
* Record one more 'Like' indication from a user.
*/
public void like()
{
likes++;
}
/**
* Record that a user has withdrawn his/her 'Like' vote.
*/
public void unlike()
{
if (likes > 0) {
likes--;
}
}
/**
* Add a comment to this post.
*
* @param text The new comment to add.
*/
public void addComment(String text)
{
comments.add(text);
}
/**
* Return the time of creation of this post.
*
* @return The post's creation time, as a system time value.
*/
public long getTimeStamp()
{
return timestamp;
}
/**
* Display the details of this post.
*
* (Currently: Print to the text terminal. This is simulating display
* in a web browser for now.)
*/
public void display()
{
System.out.println(username);
System.out.print(timeString(timestamp));
if(likes > 0) {
System.out.println(" - " + likes + " people like this.");
}
else {
System.out.println();
}
if(comments.isEmpty()) {
System.out.println(" No comments.");
}
else {
System.out.println(" " + comments.size() + " comment(s). Click here to view.");
}
}
/**
* Create a string describing a time point in the past in terms
* relative to current time, such as "30 seconds ago" or "7 minutes ago".
* Currently, only seconds and minutes are used for the string.
*
* @param time The time value to convert (in system milliseconds)
* @return A relative time string for the given time
*/
private String timeString(long time)
{
long current = System.currentTimeMillis();
long pastMillis = current - time; // time passed in milliseconds
long seconds = pastMillis/1000;
long minutes = seconds/60;
if(minutes > 0) {
return minutes + " minutes ago";
}
else {
return seconds + " seconds ago";
}
}
}
评论Post.java
public class CommentedPost extends Post {
public CommentedPost(String author) {
super(author);
// TODO Auto-generated constructor stub
}
}
事件Post.java
public class EventPost extends Post{
public EventPost(String author) {
super(author);
// TODO Auto-generated constructor stub
}
}
留言Post.java
public class MessagePost extends Post{
private String message; // an arbitrarily long, multi-line message
/**
* Constructor for objects of class MessagePost.
*
* @param author The username of the author of this post.
* @param text The text of this post.
*/
public MessagePost(String author, String text)
{
super(author);
message = text;
}
/**
* Return the text of this post.
*
* @return The post's message text.
*/
public String getText()
{
return message;
}
/**
* Display the details of this post.
*
* (Currently: Print to the text terminal. This is simulating display
* in a web browser for now.)
*/
public void display()
{
super.display();
System.out.println(message);
}
}
StartNetwork.java
public class StartNetwork{
/**
* @param args
*/
public static void main( String[] args )
{
MessagePost message = new MessagePost("White Rabbit", "Oh dear, oh dear, I shall be late!");
PhotoPost photo = new PhotoPost("Alice Wonderland", "RabbitHole.jpg" ,"Down the rabbit hole :)");
message.addComment( "Your watch is exactly two days slow." );
photo.like();
NewsFeed news = new NewsFeed();
news.addPost( message );
news.addPost( photo );
news.show();
}
}
照片Post.java
public class PhotoPost extends Post{
private String filename; // the name of the image file
private String caption; // a one line image caption
/**
* Constructor for objects of class PhotoPost.
*
* @param author The username of the author of this post.
* @param filename The filename of the image in this post.
* @param caption A caption for the image.
*/
public PhotoPost(String author, String filename, String caption)
{
super(author);
this.filename = filename;
this.caption = caption;
}
/**
* Return the file name of the image in this post.
*
* @return The post's image file name.
*/
public String getImageFile()
{
return filename;
}
/**
* Return the caption of the image of this post.
*
* @return The image's caption.
*/
public String getCaption()
{
return caption;
}
/**
* Display the details of this post.
*
* (Currently: Print to the text terminal. This is simulating display
* in a web browser for now.)
*/
public void display()
{
super.display();
System.out.println(" [" + filename + "]");
System.out.println(" " + caption);
}
}
NewsFeed.java
public class NewsFeed{
private ArrayList<Post> posts;
/**
* Construct an empty news feed.
*/
public NewsFeed()
{
posts = new ArrayList<Post>();
}
/**
* Add a post to the news feed.
*
* @param post The post to be added.
*/
public void addPost(Post post)
{
posts.add(post);
}
/**
* Show the news feed. Currently: print the news feed details
* to the terminal. (To do: replace this later with display
* in web browser.)
*/
public void show()
{
// display all posts
for(Post post : posts) {
post.display();
System.out.println(); // empty line between posts
}
}
}
重构后的代码应该有一个 class 图表,其中包含以下内容:
Post w/字段用户名和时间戳
已评论Post(指向Post 的箭头,即从它继承)w/字段喜欢和评论
EventPost(箭头指向 Post)w/字段 eventType
消息Post(箭头指向已评论Post)w/字段消息
照片Post(箭头指向评论Post)w/字段文件名和标题
Post 包含点赞和评论。您应该将这些字段移动到 CommentedPost.
我不确定字段 eventType 是什么,但是 EventPost 没有这样的字段。你应该创建它。
根据您的描述,MessagePost 应该扩展 CommentedPost。它不是;相反,它扩展了 Post。您应该更改它,使其扩展 CommentedPost.
根据您的描述,PhotoPost 应该扩展 CommentedPost。它不是;相反,它扩展了 Post。您应该更改它,使其扩展 CommentedPost.