2020. 9. 14. 14:13ㆍ컴퓨터 수업/자료구조
@ADT
Logical level
Abstract data type
클래스(class) (header에 정의되어 있는)
구현을 기다리는 abstract 추상화 클래스.(java)
"Tiger.h"
class Tiger
{
private:
char* habitat;
public:
Tiger();
void Move();
};
@Domain
데이터 멤버(data member)
필드(field) //java
private:
char* habitat;
@Operation
멤버 함수(member function)
메소드(method)
public:
Tiger();
void Move();
@implementation
구현
ADT로 만든, header로 원형만 지정되어있는, 클래스를 cpp에다가 만드는 것.
#include "Tiger.h"
#include <string>
#include <iostream>
Tiger::Tiger()
{
habitat = "Jungle";
}
void Tiger::Move()
{
std::cout << "Tiger had been moved" << std::endl;
}
@specification
명세서
규격 명세
ADT의 필드와 메소드의 설명을 적는 일.
class UnsortedType
{
public:
UnsortedType();
// Constructor
bool IsFull() const;
// Function: Determines whether list is full.
// Pre: List has been initialized.
// Post: Function value = (list is full)
int LengthIs() const;
// Function: Determines the number of elements in list.
// Pre: List has been initialized.
// Post: Function value = number of elements in list.
}
이렇게 주석을 통해서 Function, Pre, Post를 적는다.
Textbook에는 다음과 같이 나와있다.
@Application level
User가 받아들이는 level
Test driver level
@implementation level
application level -> logical level -> implementation level
main.cpp -> .h -> .cpp
@predefined C++ types
미리 정의된 C++의 types? 여기서 types를 datatypes라고 이해할 수 있어야 한다.
@Test plan
Test case 중심 코딩? 을 들어본 적이 있을 것이다.
어떤 input argument에 대해서 output argument를 예상하고, input을 넣어 보았을 때, 내가 코딩이 아닌 머릿속으로 생각한 답이 실제로 나오는지 확인해 보는 것이다.
이때 input으로 넣는 값을 뭘 넣을지에는 여러 방법론이 존재하는데, 우리는 주로 불가능한 결과가 나올 것 같은 경우를 생각해서 넣어본다. 예를 들어 list의 DeleteItem을 호출할 때, argument로 넣어주는 item은 list에 존재할 수도 있고, 존재하지 않을 수 도 있다. 따라서 어떤 boundary느낌의 이진적으로 사유될 수 있는 argument를 넣는다, 있거나 , 없거나 등의, 혹은 x의 정의역이 [0,10]이라면 0도 넣어보고 10도 넣어보고 (11도 넣어보고) -> 이때는 오류가 난다는 것을 output으로 예상할 수 있겠다.
따라서 Test plan은 다음과 같은 양식으로 작성한다.
@Test Driver
뭐 말할 필요도 없을 것 같다.
Test plan을 수행하기 위한 코드이다. 주로 main함수에서 수행하며,
3가지 단계를 거친다.
1. input file의 이름을 cin으로 받는다.
2. output file의 이름을 cin으로 받는다.
3. test를 Quit이라는 command가 나올 때까지 실행한다.
따라서 다음과 같은 구조를 가진다.
// Test driver
#include <iostream>
#include <fstream>
#include <string>
#include <cctype>
#include <cstring>
#include "unsorted.h"
using namespace std;
void PrintList(ofstream& outFile, UnsortedType list);
bool IsThere(UnsortedType& list, const ItemType& item)
//Function: Determines whether there is an element with this item in the list
//Pre : List has been initialized.
//Post :return bool value to determine whether ther is an element with this item in the list
{
ItemType itemInList;
list.ResetList();
bool found = false;
for (int i = 0;i < list.LengthIs();i++)
{
list.GetNextItem(itemInList);
if (item.ComparedTo(itemInList) == EQUAL)
{
found = true;
break;
}
}
return found;
}
int main()
{
ifstream inFile; // file containing operations
ofstream outFile; // file containing output
string inFileName; // input file external name
string outFileName; // output file external name
string outputLabel;
string command; // operation to be executed
int number;
ItemType item;
UnsortedType list;
bool found;
int numCommands;
// Prompt for file names, read file names, and prepare files
cout << "Enter name of input command file; press return." << endl;
cin >> inFileName;
inFile.open(inFileName.c_str());
cout << "Enter name of output file; press return." << endl;
cin >> outFileName;
outFile.open(outFileName.c_str());
cout << "Enter name of test run; press return." << endl;
cin >> outputLabel;
outFile << outputLabel << endl;
inFile >> command;
numCommands = 0;
while (command != "Quit")
{
if (command == "InsertItem")
{
inFile >> number;
item.Initialize(number);
list.InsertItem(item);
item.Print(outFile);
outFile << " is inserted" << endl;
}
else if (command == "DeleteItem")
{
inFile >> number;
item.Initialize(number);
list.DeleteItem(item);
item.Print(outFile);
outFile << " is deleted" << endl;
}
else if (command == "RetrieveItem")
{
inFile >> number;
item.Initialize(number);
list.RetrieveItem(item, found);
if (found)
outFile << number << " found in list." << endl;
else outFile << number << " not in list." << endl;
}
else if (command == "LengthIs")
outFile << "Length is " << list.LengthIs() << endl;
else if (command == "IsFull")
if (list.IsFull())
outFile << "List is full." << endl;
else outFile << "List is not full." << endl;
else PrintList(outFile, list);
numCommands++;
cout << " Command number " << numCommands << " completed."
<< endl;
inFile >> command;
};
cout << "Testing completed." << endl;
inFile.close();
outFile.close();
return 0;
}
void PrintList(ofstream& dataFile, UnsortedType list)
// Pre: list has been initialized.
// dataFile is open for writing.
// Post: Each component in list has been written to dataFile.
// dataFile is still open.
{
int length;
ItemType item;
list.ResetList();
length = list.LengthIs();
for (int counter = 1; counter <= length; counter++)
{
list.GetNextItem(item);
item.Print(dataFile);
}
dataFile << endl;
}
@menu driven testing
driven = 중심의 , 즉 메뉴 중심의 테스팅이다.
Test driver를 test plan을 보고 구현하는 일은 상당히 많은 방법론이 존재할 것이다.
그중, 위에 소개된 코드는 menu driven testing이다. *. in 파일로 menu(=command)를 받아서 test를 실행하는 것이다. 이때 menu(=command)는 다음과 같다.
LengthIs
InsertItem 5
InsertItem 7
InsertItem 6
InsertItem 9
PrintList
InsertItem 1
PrintList
RetrieveItem 4
RetrieveItem 5
RetrieveItem 9
RetrieveItem 10
IsFull
DeleteItem 5
IsFull
DeleteItem 1
DeleteItem 6
DeleteItem 9
PrintList
Quit
이 파일은 메모장으로 불러올 수 있다.
@client function
Rather than enhancing the Unsorted List ADTs by adding a member function IsThere, you decide to write a client function to do the same task.
User function이라고 해도 될 것 같다. 그러니까 member 함수가 아닌 외부에서 friend를 사용 해 프라이빗 멤버에 접근하는 함수던, 그 클래스의 프라이빗 멤버에 접근할 수 없는, 함수를 client function이라 한다. (해당 클래스 스코프 :: 가 없다.)
'컴퓨터 수업 > 자료구조' 카테고리의 다른 글
리스트와 스택의 차이 (0) | 2020.10.05 |
---|---|
Big O notation (0) | 2020.09.15 |
List (0) | 2020.09.15 |
buffer란? (0) | 2020.09.14 |
ADT (Abstract Data Type) (0) | 2020.09.14 |