В Википедии есть хорошие определения:
- http://en.wikipedia.org/wiki/Inversion_of_control
- http://en.wikipedia.org/wiki/Dependency_injection
Внедрение зависимости - это просто причудливый способ сказать, что класс взаимодействует с другим через интерфейс (графический API) и что он обеспечивает способ изменения того, на что указывает интерфейс (т. Е. Внедрение зависимости от другого класса).
В отношении инверсии контроля Википедия упоминает такие вещи, как шаблон Фабрики.
В нем также упоминается внедрение метода setter (изменение реализации интерфейса с помощью функции setter), внедрение конструкции (настройка реализации интерфейса из конструктора) или внедрение интерфейса (запрос реализации интерфейса из другого интерфейса) и отмечает, что это типы зависимостей. Инъекции.
Это то, что происходит здесь - программа может изменить API рисования программы черепахи (Dependency Injection), используя метод установки (Inversion of Control).
Это позволяет вам иметь тестовый класс, подобный этому:
struct DrawingTester : public DrawingInterface
{
void move_to(long x, long y) { printf("moveto %d %d\n", x, y); }
void line_to(long x, long y) { printf("lineto %d %d\n", x, y); }
};
и запустить его через тестовую программу:
int main(int argc, char **argv) {
DrawingTester drawing;
Turtle t;
t.setDrawingApi(&drawing);
t.runProgramFromFile(argv[0]);
return 0;
}
После этого вы можете получить программы тестирования черепахи / логотипа с ожидаемым выводом из DrawingTester. Например:
# test1.logo
MOVE 5, 7
# test1.calls
moveto 5 7
и проведите его через набор тестов (например, https://github.com/rhdunn/cainteoir-engine/blob/master/tests/harness.py и https://github.com/rhdunn/cainteoir-engine/blob/master/tests/metadata.py).