हम काम पर हमारे निम्न स्तर के नेटवर्किंग कोड के लिए एक साधारण ऑब्जेक्ट मॉडल का उपयोग करते हैं जहां संरचना पॉइंटर्स उन कार्यों के आसपास पारित किए जाते हैं जो विधियों के नाटक कर रहे हैं। मुझे इस कोड का अधिकांश विरासत मिला है जो कि योग्य सी/सी ++ अनुभव के साथ परामर्शदाताओं द्वारा लिखे गए थे और मैंने कई देर रात को कोड को दोबारा बदलने की कोशिश की जो एक उचित संरचना जैसा दिखता है।मैं विरासत के बिना वस्तुओं को कैसे नकल कर सकता हूं (सी में)?
अब मैं यूनिट परीक्षण के तहत कोड लाना चाहता हूं लेकिन हमारे द्वारा चुने गए ऑब्जेक्ट मॉडल पर विचार करने के लिए मुझे नहीं पता कि ऑब्जेक्ट्स का नकल कैसे करें।
नमूना हैडर (foo.h):
#ifndef FOO_H_
#define FOO_H_
typedef struct Foo_s* Foo;
Foo foo_create(TcpSocket tcp_socket);
void foo_destroy(Foo foo);
int foo_transmit_command(Foo foo, enum Command command);
#endif /* FOO_H_ */
नमूना स्रोत (foo.c): नीचे दिए गए उदाहरण देखें
struct Foo_s {
TcpSocket tcp_socket;
};
Foo foo_create(TcpSocket tcp_socket)
{
Foo foo = NULL;
assert(tcp_socket != NULL);
foo = malloc(sizeof(struct Foo_s));
if (foo == NULL) {
goto fail;
}
memset(foo, 0UL, sizeof(struct Foo_s));
foo->tcp_socket = tcp_socket;
return foo;
fail:
foo_destroy(foo);
return NULL;
}
void foo_destroy(Foo foo)
{
if (foo != NULL) {
tcp_socket_destroy(foo->tcp_socket);
memset(foo, 0UL, sizeof(struct Foo_s));
free(foo);
}
}
int foo_transmit_command(Foo foo, enum Command command)
{
size_t len = 0;
struct FooCommandPacket foo_command_packet = {0};
assert(foo != NULL);
assert((Command_MIN <= command) && (command <= Command_MAX));
/* Serialize command into foo_command_packet struct */
...
len = tcp_socket_send(foo->tcp_socket, &foo_command_packet, sizeof(foo_command_packet));
if (len < sizeof(foo_command_packet)) {
return -1;
}
return 0;
}
उदाहरण में ऊपर मैं नकली चाहते हैं TcpSocket ऑब्जेक्ट ताकि मैं इकाई परीक्षण के तहत "foo_transmit_command" ला सकता हूं लेकिन मुझे यकीन नहीं है कि विरासत के बिना इस बारे में कैसे जाना है। मैं वास्तव में vtables का उपयोग करने के लिए कोड को फिर से डिजाइन नहीं करना चाहता जब तक कि मुझे वास्तव में नहीं करना है। हो सकता है कि मजाक करने से इससे बेहतर दृष्टिकोण हो?
मेरा परीक्षण अनुभव मुख्य रूप से सी ++ से आता है और मुझे थोड़ा डर है कि मैंने खुद को यहां एक कोने में चित्रित किया होगा। मैं अधिक अनुभवी परीक्षकों की किसी भी सिफारिश की अत्यधिक सराहना करता हूं।
संपादित करें:
तरह रिचर्ड क्विर्क ने बताया यह वास्तव में "tcp_socket_send" करने के लिए कॉल कि मैं ओवरराइड करना चाहते है और मैं पुस्तकालय से असली tcp_socket_send प्रतीक को हटाने कब से परीक्षण को जोड़ने के बिना यह करने के लिए पसंद करेंगे इसे उसी बाइनरी में अन्य परीक्षणों द्वारा बुलाया जाता है।
.. मुझे लगता है कि करने के लिए है कि वहाँ इस समस्या का कोई स्पष्ट समाधान शुरू कर
मैं इसे शायद टीसीपी सॉकेट हेडर में डाल सकता हूं और इसे #ifdef परीक्षण में संलग्न कर सकता हूं .. #endif। अच्छा सुझाव। –
आप अपने कोड को बेहतर तरीके से जानते हैं, मैं बस यह कहना चाहता था कि मैक्रो एक पूरी चीज है और गलत स्थान पर रखा गया मैक्रो समस्या का कारण बन सकता है जो – Ilya