æŠèŠ
çŸåšãåã³ã³ããŒãã³ãã¯ãã¹ãŠã¡ã€ã³ããã°ã©ã ã®ã°ããŒãã«å€æ°ãšããŠå®£èšãããŠããã
ã¡ãªãã
- ã¡ã€ã³ããã°ã©ã å
ããåã³ã³ããŒãã³ãã«ã¢ã¯ã»ã¹ããã®ã容æ(ã©ãããã§ãã¢ã¯ã»ã¹å¯èœ)
ãã¡ãªãã
- ã¢ã«ãŽãªãºã ã®ãã¡ã€ã«ãå€éšåããã®ãé£ãã
- ã³ã³ããŒãã³ããã©ãã§ã¢ã¯ã»ã¹ãããŠããã®ãããããªããªããå°æ¥çã«ãã°ã®çºçæºãç¹å®ããã®ãé£ãããªãå¯èœæ§ãé«ãã
ã¡ãªããããããã¡ãªããã倧ããã®ã§ãã¡ã€ã³ããã°ã©ã ã®ã°ããŒãã«å€æ°ã«è²ã
眮ãã®ãããããããšããã®ãäž»é¡ã
詳现
以äžã«çŸåšã®ã¡ã€ã³ããã°ã©ã ã®ãµã³ãã«ã瀺ããïŒèª¬æã®ããã«äžéšçç¥ããŠããããšãæ£ããããã°ã©ã ã§ã¯ãªãããšã«æ³šæïŒ
Motor *left_motor;
Motor *right_motor;
Sensor *mid_sensor;
Sensor *left_sensor;
Sensor *right_sensor;
void setup() {
left_motor = new Motor();
right_motor = new Motor();
mid_sensor = new Sensor();
// çç¥
}
void loop() {
some_algorithm();
}
void some_algorithm() {
// åã³ã³ããŒãã³ãã¯ã©ã¹ãåç
§ããŠåŠçãè¡ã
}
ãã®some_algorithmãå€éšåããã«ã¯ããŸãåãã«ãsome_algorithmãåŒæ°ã䜿ã£ãŠåäœããããã«å€æŽããå¿
èŠãããã
void some_algorithm(Motor *left_motor, Motor *right_motor, Sensor* mid_sensor, Sensor*right_sensor, Sensor *left_sensor) {
// do something...
}
åŒæ°ã§åãåã圢ã«ãããããšã¯ãã®é¢æ°ãå€éšãã¡ã€ã«ã«å®çŸ©ã»å®è£
ããŠã€ã³ã¯ã«ãŒãããã°ãããããã§äžå¿å€éšãã¯ã§ããããšã«ãªãã
ã§ããã°ããŒãã«å€æ°ãžã®äŸåã¯è»œæžã§ããããã©ããäŸç¶ãšããŠã¡ã€ã³ããã°ã©ã ã§ã°ããŒãã«å€æ°ã¯æžã£ãŠããªããããã§æ¬¡ã®ã¢ãŒããã¯ãã£ãææ¡ããã
æ°ããæ¡çšããã¢ãŒããã¯ãã£
çŸç¶ã®åé¡ç¹
ãããŸã§ã説æããŠããããã«ãããŸã§ã®èšèšã«ã¯ä»¥äžã®åé¡ãããã
- ã°ããŒãã«å€æ°ãå€ããã
- ã¢ã«ãŽãªãºã ã®å€éšåãé£ãã
å
šã³ã³ããŒãã³ãã®ä»²ä»ã¯ã©ã¹ã§ã°ããŒãã«å€æ°ãäžã€ã«ãã
ãŸããã°ããŒãã«å€æ°ãæžããã«ã¯ãåã³ã³ããŒãã³ãããŸãšãã仲ä»åœ¹ã®ã¯ã©ã¹ãäœãã°ãããããããã°ãã°ããŒãã«å€æ°ãäžã€ã«ããããšãã§ããã
äŸãã°ãã©ã€ã³ãã¬ãŒã¹è»ã ã£ãããTraceCarã¯ã©ã¹ãäœã£ãŠãã©ã€ã³ãã¬ãŒã¹è»ãæã€åã³ã³ããŒãã³ããTraceCarã¯ã©ã¹å
ã«å®çŸ©ãããTraceCarã¯ã©ã¹ã¯åã³ã³ããŒãã³ããžã®ãã¢ã¯ã»ã¹ã®ã¿ãæäŸãããã®ãšããã¢ã«ãŽãªãºã éšã¯ãã®TraceCarã¯ã©ã¹ãçµç±ããŠã³ã³ããŒãã³ãã«ã¢ã¯ã»ã¹ããã
ããããããšã§ãå
çšã®some_algorithmã¯ä»¥äžã®ããã«åäžå€æ°ãåãåã圢ã«æžãçŽãããããŒããŠã§ã¢ã«å€æŽãå
¥ã£ãŠãåŒæ°ã®æ°ãåã«ã¯å€æŽãçããªãã
void some_algorithm(Car *car) {
// do something...
}
ã ãã¶ç°¡çŽ ã«ãªã£ãããããªã«é£ããããšã¯ããŠããªããŠãã³ã³ããŒãã³ãã®ã¢ã¯ã»ã¹ã«ã¯ã³ã¯ãã·ã§ã³æãæãã«ãªã£ãã ãã
// ãããŸã§
left_sensor->GetRawValue();
// ãããã
car->GetLeftSensor()->GetRawValue();
ã¡ãã£ãšèšè¿°ãé·ããªãããã©ãå€æŽã«åŒ·ããªãã¡ãªãããèããã°èš±å®¹ã¬ãã«ããªãç¹°ãè¿ãåç
§ãããªã©ãé·ãèšè¿°ãç
©ãããå Žåã¯ãé©å®äžæçã«ãã€ã³ã¿å€æ°ãäœããªã©ããŠå¯Ÿå¿ããã
Sensor* left_sensor = car->GetLeftSensor();
left_sensor->GetRawValue();
ã¢ã«ãŽãªãºã ã®å€éšå
ã°ããŒãã«å€æ°ãæžãããããšã§ãã¢ã«ãŽãªãºã ã®å€éšåã容æã«ãªã£ãã
ããã§ããŸãæ°ãã課é¡ç¹ãèŠããŠããã
ã¢ã«ãŽãªãºã å·®ãæ¿ãã«é¢æ°åå·®ãæ¿ãããã®ã¯ãã¹ãçºçããããã®ã§ãé¿ãããã
äŸãã°ãalgorithm1ã§åãããããšããã¡ã€ã³ããã°ã©ã ã®ã«ãŒãé¢æ°å
ã§ã¯ä»¥äžã®ããã«åŒã³åºãã
次ã«algorithm2ã§åãããããšããå
çšã®äžè¡ã¯
ã«æžãæããã°ãããã
loopé¢æ°ã¯å®éã®ã©ã€ããµã€ã¯ã«ã®ã¿ã®å®çŸ©ã«éäžãã¹ãã§ãããsetupé¢æ°å
ã§åäœãå®å
šã«æ±ºå®ããŠããŸãããã(é¢æ°åçã«ããããçã«ããªã£ãŠãã)
ã¢ã«ãŽãªãºã éšãå·®ãæ¿ãã容æã«ãªãããã«ãCarControllerã€ã³ã¿ãã§ãŒã¹ãå®çŸ©ãããä»ããããããšã¯ãåã¢ã«ãŽãªãºã ã®åŒã³åºãæ¹ãçµ±äžããããšã
class CarController {
public:
virtual void Operate();
};
ã¢ã«ãŽãªãºã å®è£
ã¯ã©ã¹ã¯ãã¹ãŠãã®CarControllerã€ã³ã¿ãã§ãŒã¹ã®èŠä»¶ãæºãããŠãããšãããã
loopé¢æ°ã«å€æŽã¯å
¥ãããsetupé¢æ°å
ã§åŠçã¢ã«ãŽãªãºã ãå·®ãæ¿ããããšãã§ããã
CarController *controller;
void setup() {
Car *car = new Car();
controller = new ExampleController(car); // ããã®newã®åŸããå€ãããšã¢ã«ãŽãªãºã ãåãæ¿ãã
}
void loop() {
controller->Operate();
}
ä»åŸã®èšèšæ¹é
ã |
Before |
After |
ã³ã³ããŒãã³ãå€æ°ã®å®çŸ©å Žæ |
ã¡ã€ã³ããã°ã©ã ã®ã°ããŒãã«ã¹ã³ãŒã |
xxxCar ã¯ã©ã¹ã®privateã¹ã³ãŒã |
ã¢ã«ãŽãªãºã ã®å®çŸ©æ¹æ³ |
ã¡ã€ã³ããã°ã©ã ã®loopé¢æ°å
éš |
CarControllerã¯ã©ã¹ã®å®è£
ã¯ã©ã¹ã®Operateã¡ãœããå
|