我有一種方法,它由一些邏輯+底層系統調用組成。現在需要實現另一種包含完全相似的邏輯但僅包含底層系統調用更改的方法。消除類似函數定義的重複代碼
我試圖想出一些方法來重用通用代碼,並實現另一種方法,可能需要一個可調用的調用底層系統調用,但由於read
和recv
的調用是不同的,所以一直沒有成功。
很高興找到一個相同的優雅的解決方案。該方法看起來像 -
第一個功能
std::string Socket::read(const int bufSize) const
{
auto buffer = std::make_unique<char[]>(bufSize + 1);
auto recvd = 0, count = 0;
std::string str;
str.reserve(bufSize);
do {
// ONLY THIS PART IS DIFFERENT
recvd = ::read(sockfd, buffer.get() + count, bufSize - count);
// ONLY THIS PART IS DIFFERENT
count += recvd;
if (count == bufSize) {
str.append(buffer.get());
str.reserve(str.length() + bufSize);
std::memset(buffer.get(), 0, bufSize);
count = 0;
}
} while (recvd > 0);
str.append(buffer.get(), count);
if (recvd == -1) {
// TODO: Check for recvd == EAGAIN or EWOULDBLOCK and
// don't throw exception in that case.
throw std::runtime_error("Error occurred while writing message");
}
return str;
}
二功能
std::string Socket::recv(const int bufSize, SF::recv flags) const
{
auto buffer = std::make_unique<char[]>(bufSize + 1);
auto recvd = 0, count = 0;
std::string str;
str.reserve(bufSize);
do {
// ONLY THIS PART IS DIFFERENT
const auto f = static_cast<int>(flags);
recvd = ::recv(sockfd, buffer.get() + count, bufSize - count, f);
// ONLY THIS PART IS DIFFERENT
count += recvd;
if (count == bufSize) {
str.append(buffer.get());
str.reserve(str.length() + bufSize);
std::memset(buffer.get(), 0, bufSize);
count = 0;
}
} while (recvd > 0);
str.append(buffer.get(), count);
if (recvd == -1) {
// TODO: Check for recvd == EAGAIN or EWOULDBLOCK and
// don't throw exception in that case.
throw std::runtime_error("Error occurred while writing message");
}
return str;
}
你能解釋一下代碼應該做什麼嗎?我明白了基本要點,但我認爲可能更簡單和更短的方法來實現兩者。 – tambre
雖然我應該提到,簡單的方法是將功能邏輯簡單地分成不同的功能。沒有什麼驚天動地的。 – tambre
@tambre從'套接字讀取並返回一個'std :: string'。 –