Việc thêm chức năng vào một lớp có thể được thực hiện bằng cách thêm một phương thức hoặc bằng cách xác định một hàm lấy đối tượng làm tham số đầu tiên của nó. Hầu hết các lập trình viên mà tôi biết sẽ chọn giải pháp thêm một phương thức thể hiện.Chọn giữa các phương pháp mẫu và các chức năng miễn phí?
Tuy nhiên, đôi khi tôi muốn tạo một hàm riêng biệt. Ví dụ: trong mã ví dụ bên dưới Area
và Diagonal
được định nghĩa là các hàm miễn phí thay vì phương pháp. Tôi tìm thấy nó tốt hơn theo cách này bởi vì tôi nghĩ rằng các chức năng này cung cấp các cải tiến hơn là chức năng cốt lõi.
Đây có phải là hành vi tốt/xấu không? Nếu câu trả lời là "nó phụ thuộc", thì các quy tắc để quyết định giữa việc thêm phương thức hoặc xác định một hàm riêng biệt là gì?
class Rect
{
public:
Rect(int x, int y, int w, int h) :
mX(x), mY(y), mWidth(w), mHeight(h)
{
}
int x() const { return mX; }
int y() const { return mY; }
int width() const { return mWidth; }
int height() const { return mHeight; }
private:
int mX, mY, mWidth, mHeight;
};
int Area(const Rect & inRect)
{
return inRect.width() * inRect.height();
}
float Diagonal(const Rect & inRect)
{
return std::sqrt(std::pow(static_cast<float>(inRect.width()), 2) + std::pow(static_cast<float>(inRect.height()), 2));
}
Một lưu ý phụ, sử dụng pow với công suất không đổi của hai cực kỳ không hiệu quả so với việc chỉ viết chính x * x + y * y + z * z. –
@Mark B: Cảm ơn, tôi không biết điều đó. – StackedCrooked
Xem phần _ cổ điển [Các hàm không phải thành viên cải thiện đóng gói] (http://drdobbs.com/cpp/184401197) _. ("Khi bạn nghĩ đóng gói, bạn nên nghĩ rằng các chức năng không phải là thành viên") Xem thêm http://stackoverflow.com/q/1692084/140719. – sbi