我正在尝试重构代码,由于对编程非常陌生,因此很难知道从哪里开始。

我尝试将方法注释放在类CommentedPost下,就像并且与众不同,但是我不知道该怎么办了。

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";
    }
}
}


CommentedPost.java

public class CommentedPost extends Post {

public CommentedPost(String author) {
    super(author);
    // TODO Auto-generated constructor stub
}
}


EventPost.java

public class EventPost extends Post{

public EventPost(String author) {
    super(author);
    // TODO Auto-generated constructor stub
}

}


MessagePost.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();
}
}


PhotoPost.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
    }
}
}


重构后的代码应该具有一个带有以下内容的类图:

带字段用户名和时间戳发布

带字段喜欢和评论的CommentedPost(箭头指向Post,即继承自Post)

带字段eventType的EventPost(指向Post的箭头)

带字段消息的消息发布(指向CommentedPost的箭头)

带字段文件名和标题的PhotoPost(指向CommentedPost的箭头)

最佳答案

帖子包含喜欢和评论。您应该将这些字段移到CommentedPost。

我不确定eventType是什么字段,但是EventPost没有这样的字段。您应该创建它。

根据您的描述,MessagePost应该扩展CommentedPost。它不是;相反,它扩展了Post。您应该对此进行更改,以使其扩展CommentedPost。

根据您的描述,PhotoPost应该扩展CommentedPost。它不是;相反,它扩展了Post。您应该对此进行更改,以使其扩展CommentedPost。

10-06 12:37