일부 논리 + 기본 시스템 호출로 구성된 메소드가 있습니다. 이제는 정확히 비슷한 논리를 포함하지만 기본 시스템 호출 변경 만 포함하는 다른 방법을 구현해야합니다.유사한 함수 정의에 대해 중복 코드를 제거합니다.
일반적인 코드를 재사용하고 기본 시스템 호출을 호출 할 수있는 다른 방법을 구현하는 방법을 생각하려고 시도하지만 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는' socket'에서 읽고'std :: string'을 반환합니다. –