본문 바로가기

기타

online -shop

- 불완전 버전
1. SalesItem 클래스 
 
- 온라인 이커머스 사이트의 제품 판매를 대표 
- SalesItem 객체는 모든 제품과 관련된 정보를 저장 (제품명세, 가격, 고객 댓글 등)

package online_shop;

import java.util.ArrayList;
import java.util.Iterator;

public class SalesItem {
	private String name;
	private int price; //in cents
	private ArrayList<Comment> comments;
	
	// 새로운 판매 제품 생성
	public SalesItem(String name, int price)
	{
		this.name = name;
		this.price = price;
		comments = new ArrayList<>();
	}
	
	//제품 이름 리턴
	public String getName()
	{
		return name;
	}
	
	//제품 가격 리턴
	public int getPrice()
	{
		return price;
	}
	
	//제품의 고객 리뷰 수 리턴
	public int getNumberOfComments()
	{
		return comments.size();
	}
	
	//제품의 comment list에 리뷰 추가 
	//성공시 true 리턴, 실패시 false 리턴
	public boolean addComment(String author, String text,int rating)
	{
		if(ratingInvalid(rating)) {
			//reject invalid ratings
			return false;
		}
		if(findCommentByAuthor(author)!=null) {
			//reject mutiple commets by same author
			return false;
		}
		
		comments.add(new Comment(author,text,rating));
		return true;
	}
	
	//index에서 comment 업데이트 즉, comment를 더 유용한 것으로 간주, index가 올바르지 않으면 수행 x
	public void upvoteComment(int index)
	{
		if(index >=0 && index < comment.size()) {
			comments.get(index).upvote();
		}
	}
	
	//index에서 comment 삭제
	public void downvoteComment(int index)
	{
		if(index >=0 && index < comments.size())
		{
			comments.get(index).downvote();
		}
	}
	
	// 모든 comment 보여주기 
	//현재 목적 : 터미널에 인쇄, 웹 디스플레이를 위해 추후 수정
	public void showInfo()
	{
		System.out.println("*** " + name + " ***");
        System.out.println("Price: " + priceString(price));
        System.out.println();
        System.out.println("Customer comments:");
        for(Comment comment : comments) {
            System.out.println("-------------------------------------------");
            System.out.println(comment.getFullDetails());
        }
        System.out.println();
        System.out.println("===========================================");
		
	}
	
	//가장 유용한 comment를 반환, 가장 유용한 comment는 vote balance가 가장 높은 의견
	//vote balance가 높은 comment가 여러 개 있는 경우 해당 comment 중 하나를 반환
	public Comment findMostHelpfulComment()
	{
		if(comments.isEmpty())
		{
			return null; //comment가 비어져 있다면 null 출력
		}
		Iterator<Comment> it = comments.iterator(); //Iterator<E> 객체 생성 
		Comment best = it.next(); //다음 원소 위치로 가서 리턴 
		while(it.hasNext()) {//다음으로 가리킬 ㅜ언소의 존재 여부를 불리언으로 리턴
			Comment current = it.next(); 
			if(current.getVoteCount() > best.getVoteCount()) {
				best = current;
			}
		}
		return best;
	}
	
	// 지정된 rating이 유효하지 않은지 확인, 잘못된 경우 true 리턴
	// 유효한 rating 범위 [1,2,3,4,5]
	private boolean ratingInvalid(int rating)
	{
		return rating<1 || rating>5;
	}
	
	// 지정된 이름을 가진 author의 comment를 찾음
	//comment가 있으면 comment리턴, comment가 없으면 null
	private Comment findCommnetByAuthor(String author)
	{
		for(Comment comment : comments)
		{
			if(comment.getAuthor().equals(author))
			{
				return comment;
			}
		}
		return null;
	}
	
	//int로 제공된 가격에 대해 동일한 가격을 나타내는 읽을 수 있는 문자열 반환
	//price == 12345의 경우 $123.45 반환
	private String priceString(int price)
	{
		int dollars= price /100;
		int cents = price - (dollars*100);
		if(cents <=9) {
			return "$" + dollars + ".0" + cents;
		}
		else {
			return "$" + dollars + "." + cents;
		}
	}
}

 
2. Comment 클래스 
 
- 온라인 판매 사이트의 판매 항목에 대해 남겨진 의견
- comment는 text, rating, author name으로 이루어짐
- 다른 사용자는 의견이 유용했는지 (upvote, downvote)를 나타낼 수 있음
- upvote와 downvote간의 균형은 comment와 함께 저장
- negative vote balance는 찬성표보다 반대표를 더 많이 받았다는 것을 의미 
- 'votes'는 현재 테스트 목적으로만 포함되어 있으며 application에서는 표시 되지 않음 
- votes는 화면에서 comment를 선택하고 순서를 정할 때 사용
 

package online_shop;

public class Comment {
	private String author;
	private String text;
	private int rating;
	private int votes;
	
	// 모든 필수적인 디테일과 함께 comment 생성, vote balance는 0으로 초기화 
	public Comment(String author, String text, int rating)
	{
		this.author = author;
		this.text = text;
		this.rating = rating;
		votes =0;
	}
	
	// comment가 유용함을 나타냄
	public void upvote()
	{
		votes++;
	}
	
	//comment가 유용하지 않음을 나타냄
	public void downvote()
	{
		votes--;
	}
	
	//comment의 author을 리턴
	public String getAuthor()
	{
		return author;
	}
	
	//comment의 rating을 리턴
	public int getRating()
	{
		return rating;
	}
	
	// vote 숫자를 리턴
	public int getVoteCount()
	{
		return votes;
	}
	
	// comment의 text, author, raiting을 포함하는 comment의 full text와 comment의 세부사항을 리턴
	public String getFullDetails()
	{
		String details = "Rating:" + "*****".substring(0,rating) + "  " + "By:" + author + "\n" + "    " + text + "\n";
		details += "(Voted as helpful:" + votes + ")\n";
		return details;
	}
}

 
 
3. SalesItem Test 클래스 
 

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * The test class SalesItemTest.
 *
 * @author  mik
 * @version 0.1
 */
public class SalesItemTest
{
    /**
     * Default constructor for test class SalesItemTest
     */
    public SalesItemTest()
    {
    }

    /**
     * Sets up the test fixture.
     *
     * Called before every test case method.
     */
    @Before
    public void setUp()
    {
    }

    /**
     * Tears down the test fixture.
     *
     * Called after every test case method.
     */
    @After
    public void tearDown()
    {
    }

    /**
     * Test that a comment can be added, and that the comment count is correct afterwards.
     */
    @Test
    public void testAddComment()
    {
        SalesItem salesIte1 = new SalesItem("Brain surgery for Dummies", 21998);
        assertEquals(true, salesIte1.addComment("James Duckling", "This book is great. I perform brain surgery every week now.", 4));
        assertEquals(1, salesIte1.getNumberOfComments());
    }
    
    
    /**
     * Test that a comment using an illegal rating value is rejected.
     */
    @Test
    public void testIllegalRating()
    {
        SalesItem salesIte1 = new SalesItem("Java For Complete Idiots, Vol 2", 19900);
        assertEquals(false, salesIte1.addComment("Joshua Black", "Not worth the money. The font is too small.", -5));
    }

    /**
     * Test that a sales item is correctly initialised (name and price).
     */
    @Test
    public void testInit()
    {
        SalesItem salesIte1 = new SalesItem("test name", 1000);
        assertEquals("test name", salesIte1.getName());
        assertEquals(1000, salesIte1.getPrice());
    }

    @Test
    public void addComment()
    {
        SalesItem salesIte1 = new SalesItem("Brain Surgery for Dummies.", 9899);
        assertEquals(true, salesIte1.addComment("Fred", "Great - I perform brain surgery every week now!", 4));
    }

    @Test
    public void testGetNumberOfCommentsZero()
    {
        SalesItem salesIte1 = new SalesItem("book", 1000);
        assertEquals(0, salesIte1.getNumberOfComments());
    }

    @Test
    public void testGetNumberOfCommentsNotZero()
    {
        SalesItem salesIte1 = new SalesItem("Book", 1000);
    }
}

'기타' 카테고리의 다른 글

자료구조 homework 6  (0) 2023.10.02
World of zuul  (0) 2023.06.19