重构代码以反映继承层次结构

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.