forloRn_
Legacy Member
Hallo,
Hieronder vind je dezelfde code in Java en C++.
Een beetje informatie: SIPAgent HAS-A SIPApp en initialiseert die member app in zijn constructor door middel van createSIPApp(). LocalSIPAgent is een subklasse van SIPAgent en overridet createSIPApp(), waarin hij een MockSIPApp teruggeeft.
Slimme mensen herkennen hierin een Factory Method en nog slimmere mensen weten dat MockSIPApp een zogenaamd mock object is, dat unit testing van SIPAgent vergemakkelijkt omdat de low level code (hier een verbinding met een server) wordt gebypassed.
Vraag: Java gebruikt netjes polymorfisme (zie main() method) en creëert een mock object, terwijl C++ volhardt in de boosheid en een echt SIPApp-object creëert. In het geval van Java wordt de server dus gebypassed, maar in het geval van C++ niet. Waarom?
Java
SIPAgent.java:
LocalSIPAgent.java
SIPApp.java:
MockSIPapp.java:
C++
SIPAgent.cpp:
LocalSIPAgent.cpp:
SIPApp.cpp:
MockSIPApp.cpp:
main.cpp:
Hieronder vind je dezelfde code in Java en C++.
Een beetje informatie: SIPAgent HAS-A SIPApp en initialiseert die member app in zijn constructor door middel van createSIPApp(). LocalSIPAgent is een subklasse van SIPAgent en overridet createSIPApp(), waarin hij een MockSIPApp teruggeeft.
Slimme mensen herkennen hierin een Factory Method en nog slimmere mensen weten dat MockSIPApp een zogenaamd mock object is, dat unit testing van SIPAgent vergemakkelijkt omdat de low level code (hier een verbinding met een server) wordt gebypassed.
Vraag: Java gebruikt netjes polymorfisme (zie main() method) en creëert een mock object, terwijl C++ volhardt in de boosheid en een echt SIPApp-object creëert. In het geval van Java wordt de server dus gebypassed, maar in het geval van C++ niet. Waarom?
Java
SIPAgent.java:
Code:
public class SIPAgent {
public SIPAgent() {
app = createSIPApp();
}
public void setCurrentAccount() {
app.setCurrentAccount();
}
protected SIPApp createSIPApp() {
return new SIPApp();
}
private SIPApp app;
public static void main(String args[]) {
SIPAgent agent = new LocalSIPAgent();
agent.setCurrentAccount();
}
}
LocalSIPAgent.java
Code:
public class LocalSIPAgent extends SIPAgent {
protected SIPApp createSIPApp() {
return new MockSIPApp();
}
}
SIPApp.java:
Code:
public class SIPApp {
public void setCurrentAccount() {
System.out.println("used server");
}
}
MockSIPapp.java:
Code:
public class MockSIPApp extends SIPApp {
public void setCurrentAccount() {
System.out.println("didn't use server");
}
}
C++
SIPAgent.cpp:
Code:
#ifndef SIPAGENT_CPP
#define SIPAGENT_CPP
#include "SIPApp.cpp"
class SIPAgent {
public:
SIPAgent() {
app = createSIPApp();
}
~SIPAgent() {
delete app;
}
void setCurrentAccount() {
app->setCurrentAccount();
}
protected:
virtual SIPApp *createSIPApp() {
return new SIPApp;
}
private:
SIPApp *app;
};
#endif
LocalSIPAgent.cpp:
Code:
#ifndef LOCALSIPAGENT_CPP
#define LOCALSIPAGENT_CPP
#include "SIPAgent.cpp"
#include "MockSIPApp.cpp"
class LocalSIPAgent: public SIPAgent {
public:
LocalSIPAgent() {}
protected:
SIPApp *createSIPApp() {
return new MockSIPApp;
}
private:
SIPApp *app;
};
#endif
SIPApp.cpp:
Code:
#ifndef SIPAPP_CPP
#define SIPAPP_CPP
#include <iostream>
class SIPApp {
public:
void setCurrentAccount() {
std::cout << "used actual SIP server\n";
}
};
#endif
MockSIPApp.cpp:
Code:
#ifndef MOCKSIPAPP_CPP
#define MOCKSIPAPP_CPP
#include <iostream>
#include "SIPApp.cpp"
class MockSIPApp: public SIPApp {
public:
void setCurrentAccount() {
std::cout << "uh uh, no server used\n";
}
};
#endif
main.cpp:
Code:
#include "LocalSIPAgent.cpp"
#include "SIPAgent.cpp"
int main() {
SIPAgent *agent = new LocalSIPAgent;
agent->setCurrentAccount();
delete agent;
return 0;
}

