- 불완전 버전
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 |