
SQLã¯ãšãªã®çµæããããããçš®é¡ã®ãã£ãŒã«ãã¿ã€ããžã®ç¡éã®ã¿ã€ãå€æãæå³ããå Žåã ã³ãŒããboost ::ããªã¢ã³ãåã«ãããªãŒããŒããŒãã®å·šå€§ãªåæãæã€ãããŸããªããžãã¯ã§æºããããŠããå Žåã RPCãããã³ã«ã«åŸã£ãŠä»»æã®åã®åŒæ°ãåãå ¥ããæ¹æ³ãããããªãå Žåã 次ã«ãC ++ã§ã¯åçåä»ããšãã¥ã¬ãŒã·ã§ã³ã¡ã«ããºã ãå¿ èŠã§ãã æ¡åŒµå¯èœã§ãŠãŒã¶ãŒãã¬ã³ããªãŒã§ãæ確ãªAPIãäœæããŸãã äºåå®çŸ©ãããã¿ã€ãã®ãªã¹ããå¿ èŠãšãããåºæ¬ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒã䜿çšããããšã匷å¶ããªããã®ã ãã®ãããªã¡ã«ããºã ããããŸã-ããã«ãã£ã¹ãããã圹ç«ã¡ãŸãïŒ
ãã¥ã¢ã«ãã£ã¹ããããšã¯äœããC ++ã§ãããæ£ãããå¹ççãã€æ確ã«æºåããæ¹æ³ãç解ããã«ã¯ããŸããããå¿ èŠãªçç±ã説æãããã®ãœãªã¥ãŒã·ã§ã³ãžã®ãã¹ãŠã®é²åã®éçããã©ãå¿ èŠããããŸãã ãã®èª¬æããªããã°ãåå¿è ã®éçºè ã¯èªæžã®çµãããŸã§ã«å€¢äžã«ãªããçµéšè±å¯ãªéçºè ã¯ããããèªåã®å£äœã«drããééã£ãçµè«ãå°ãåºããŸãã ãããã£ãŠãæåããå§ããŸã-åçåä»ãã®åºæ¬ãšC ++ã§å¿ èŠãªãã®ããã
C ++ã§ã®åçåä»ã
C ++ã§ã¯ãå ¥åã¯éçã§ãããããã³ã³ãã€ã«æ®µéã§æšæºæäœãæäœããéã®ãšã©ãŒã远跡ã§ããŸãã ååãšããŠãã±ãŒã¹ã®90ïŒ ã§ãæäœã®çµæã®ã¿ã€ãããŸãã¯ãã¹ãŠã®å¯èœãªå€ã®åºæ¬ã¯ã©ã¹ã®ãããããäºåã«ç¥ã£ãŠããŸãã ãã ããæäœã®çµæãšããŠã®å€ã®ã¿ã€ããäºåã«ãããããå®è¡æ®µéã§èšç®ãããåé¡ã®ã¯ã©ã¹ããããŸãã å žåçãªäŸã¯ãããŒã¿ããŒã¹ãžã®ã¯ãšãªã®çµæã§ããSQLã¯ãšãªã®å®è¡çµæãšããŠãã¯ãšãªã®å®äºåŸã«é©åãªåã«å±éããå¿ èŠãããäžé£ã®å€ãååŸããŸãã
å¥ã®äŸã¯ãRPCãããã³ã«ãä»ããŠãªã¢ãŒãé¢æ°ãåŒã³åºããçµæã§ããçµæã¯å®è¡æã«èªèãããŸããç¹ã«ãRPCãããã³ã«ã®äžéAPIãæäŸãããšããäžè¬çãªåé¡ã解決ããå Žåãã¿ã¹ã¯ãèšå®ãã段éã§æ»ãå€ã®ã»ãããåžžã«äºæž¬ã§ãããšã¯éããŸããã å®è¡æã«èšç®ããã®ããã䟿å©ãªåã·ã¹ãã ã§æ©èœããæœåšçã«æ¡åŒµå¯èœãªæ©èœãããšãã°åãé¢æ°ã®åŒæ°ãSQLã¯ãšãªãã©ã¡ãŒã¿ãŒã«ã€ããŠã¯ããã¹ãŠåãããšãåœãŠã¯ãŸããŸãããããã¯äžè¬çã«äžè¬åããã®ããã䟿å©ã§ãããåæã«ãäœããã®æ¹æ³ã§ä¿åããå¿ èŠããããŸãéä¿¡ããŸãã
åºæ¬ã¯ã©ã¹ãšãã®åå«ã䜿çšããå€å žçãªãœãªã¥ãŒã·ã§ã³ããå§ããŸãã
æäœã®çµæãšããŠã®å€ã®ã¿ã€ããäºåã«ãããããå®è¡æ®µéã§èšç®ãããåé¡ã®ã¯ã©ã¹ããããŸãã å žåçãªäŸã¯ãããŒã¿ããŒã¹ã¯ãšãªã®çµæã§ã
åºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ãšç¶æ¿
C ++ã®åºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããåŸæ¥ã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãOOPãã©ãã€ã ã®1ã€ã§ããããªã¢ãŒãã£ãºã ãçŽæ¥äœ¿çšããŸãã äžè¬ã¯ã©ã¹ã¯åºå¥ãããéåžžã¯æœè±¡çã§ãçžç¶äººã§ãªãŒããŒã©ã€ããããå€ãã®ã¡ãœãããå°å ¥ããå€çžç¶äººã®å ±éã®ç¥å ã®åãžã®ãªã³ã¯ãŸãã¯ãã€ã³ã¿ã䜿çšããŠäœæ¥ãå®è¡ããŸãã
å°ããªäŸãèããŠã¿ãŸãããã å庫ã«ããŸããŸãªçš®é¡ã®ååãä¿ç®¡ãããšããã¿ã¹ã¯ããããšããŸãã 補åã«ã¯ãååãå庫å ã®è£œåã«ããŽãªèå¥åãããã³ç¹å®ã®äŸ¡æ Œãèšå®ããŸãã ãã®ã¢ãããŒãã®åºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
class IGoods { public: virtual std::string Name() const = 0; virtual int TypeID() const = 0; virtual float Price() const = 0; };
ããšãã°ããã®ãããªååã®ã«ããŽãªããèåãšããŠèšè¿°ããå¿ èŠãããå Žåãã¯ã©ã¹ãå¿ èŠã§ããããšãã°ã次ã®ãããªç¹å®ã®é¢æ°NameãTypeIDãPriceãæã€åºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ã®ç¶æ¿è ã§ãã
class Candies : public IGoods { public: static const int TYPE_ID = 9001; Candies(std::string const& name, float price); virtual std::string Name() const override { return m_name; } virtual int TypeID() const override { return TYPE_ID; } virtual float Price() const override { return m_price; } private: std::string m_name; float m_price; };
ãã®çµæãåºæ¬ã¯ã©ã¹ãžã®åç §ã®ã¿ã§åäœããŠããéããèåãªã©ã®ããããçš®é¡ã®ååã§å庫ãåããããšãã§ããŸãã ã€ãŸããå庫ã¯ãååã®ååãäŸ¡æ Œãèšäºãèªãã ãã§ããã®äžã«äœãæ ŒçŽãããŠããããæ°ã«ããªãã®ã§ãååãšããŠãçžç¶äººã¯ã©ã¹ãå®éã«ãªã³ã¯ã®åŸãã«é ããŠãããã®ãç¥ãå¿ èŠã¯ãããŸããã
次ã®å©ç¹ããããŸãã
- æ¡åŒµæ§ãäž»ãªãã©ã¹ã§ãããä»»æã®ã©ã€ãã©ãªã§çžç¶äººãäœæããå ±éã®æš©å©ã«ã€ããŠåœŒããšååããããšãã§ããŸãã ããšãã°ãç¡éåãæ¿ãã®æ¹æ³ãéžæããå Žåãããã¯æ©èœããŸãããããæç¹ã§ãã·ã¹ãã ã¯åãã¿ã€ãã®ã³ãŒãã®ç°ãªãéšåã®éå°ãªã±ãŒã¹ããªã¢ã³ãã§çªæ¯ããŸãã
- åçåä»ã-å®éãåã¯å®è¡æã«èšå®ãããã¿ã¹ã¯ã®ããžãã¯ã«å¿ããŠ1ã€ãŸãã¯å¥ã®åŸç¶ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãããã®çµæãããšãã°ãJSONãªããžã§ã¯ããŸãã¯SQLã¯ãšãªã®è§£æçµæãå ¥åã§ããŸãã
- èŠèŠå-çžç¶äººã®ããªãŒãæã€ãã¹ãŠã®äººã«éåžžã«ç°¡åã«ãã€ã¢ã°ã©ã ãæ§ç¯ããæ©èœãåºæ¬ã¯ã©ã¹ã®èª¬æã¯ãçžç¶äººã¯ã©ã¹ã®åäœã®èªææ§ãæ瀺ããŸãã
ãã ããæ¬ ç¹ã¯3ã€ãããããŸããããç¡èŠãããšãC ++ã¯ã©ã¹ã®ãã¹ãŠã®å©ç¹ã倱ãããããŒã¹ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒãžã®äœæ¥ãæžããããåžžã«é çã®çš®ã«ãªããŸãã
- äœæããããšã¯å°é£ã§ã-ããªããèšãããšã¯äœã§ããå庫ã®å å¡«ãã€ãŸãã以åã¯æªç¥ã§ãã£ãåŸç¶ã¯ã©ã¹ã®ãªããžã§ã¯ãã®äœæã¯ãå·¥å ŽãéããŠè¡ãããªããã°ãªããŸããã
- ä¿åãé£ãã-çµã¿èŸŒã¿åã«ã¯ããªã³ã¯ãšãã€ã³ã¿ãŒã®2ã€ã®ãªãã·ã§ã³ãããããŸãããä¿åã§ããã®ã¯ãã€ã³ã¿ãŒã®ã¿ã§ãã ãã¡ããããã€ã³ã¿ã§æºããããã³ã³ãããä¿åããããšã¯ã¢ããªã±ãŒã·ã§ã³ã®å¥å šæ§ã«æªåœ±é¿ãåãŒããstd :: shared_ptrãstd :: unique_ptrã®ãããªã¹ããŒããã€ã³ã¿ãå©ãã«ãªããŸãã åè ã¯éåžžã«éããåŸè ã®æ¯ãèãã¯ãæ瀺çãŸãã¯æé»çãªã³ããŒã§éãé çãåŒãèµ·ãããŸãã
- ã³ããŒããã®ã¯é£ããã§ããstd:: unique_ptrã®å Žåãç°ãªãã³ã³ããã®ç°ãªãããŒã¿ãåç §ããäºå®ããªãå Žåã¯ãstd :: shared_ptrã ãã§ãªããåºæ¬ã¯ã©ã¹ã®Cloneã¡ãœããã«ã泚æããå¿ èŠããããŸãã ã€ãŸãããŠãŒã¶ãŒã欺ããŠã³ã³ãããã³ããŒããŠãC ++ã®éåžžã®æå³ã§ããŒã¿ãã³ããŒãããªãããããªããã£ãã¯ããŒã³æäœãè¿œå ããŠåºæ¬ã¯ã©ã¹ãšãã®ãã¹ãŠã®åå«ãããã«è€éã«ããŸãã
å®éããã®å€å žçãªã¢ãããŒãã§ã¯ãããå Žæã®ã³ãŒãã¯ãã©ãŒæ ç»ã®ããã«èŠããéåžžã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãªããåæ§ã®ã¢ã³ã¹ã¿ãŒãçŸããŸãã
std::deque<std::unique_ptr<IGoods>> goods; std::unique_ptr<IGoods> result = GoodsFactory::Create<Candies>(); goods.push_back(std::move(result));
ã³ãŒãå ã®å¥ã®å Žæã§ã¯ãã¹ããŒããã€ã³ã¿ãŒãä»ããŠã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ã«ã¢ã¯ã»ã¹ãããšãææã®åœ¢åŒãå§ãŸããŸãã
std::deque<std::unique_ptr<IGoods>> another(goods.size()); std::transform(goods.begin(), goods.end(), another.begin(), [](std::unique_ptr<IGoods>& element) { return element->Clone(); } );
ããã¯ãã¹ãŠC ++ã®ææªã®äŒçµ±ã«èŠãããããã»ãšãã©ã®å Žåãéçºè ãã€ã³ã¿ãŒãã§ã€ã¹ã«çœ®ãããŠãããããªãŒãã³ãœãŒã¹ã·ã¹ãã ã«è¡šç€ºãããŠããŠãããã®ãããªæ§æãéåžžãšèããã®ã¯é©ãããšã§ã¯ãããŸããã
C ++ã§ã¯ãã¹ãŠãæ¬åœã«ã²ã©ããçæãããã³ããŒã¢ã³ãã ãŒãã³ã³ã¹ãã©ã¯ã¿ãŒãå²ãåœãŠæŒç®åãããã³ãã®ä»ã®äººçã®åã³ãæã€éåžžã®ã¯ã©ã¹ã§ã¯ã§ããŸãããïŒ ã³ã³ããã¯ã©ã¹ã®ãªããžã§ã¯ãå ã®åºæ¬ã¯ã©ã¹ãžã®ãã€ã³ã¿ãæäœããããžãã¯å šäœãã«ãã»ã«åã§ããªãã®ã¯ãªãã§ããïŒ ã¯ããäžè¬çã«ã¯äœããããŸããã
ããŒã¿ã¯ã©ã¹ã®ç¶æ¿
ä»åºŠã¯ãåºæ¬ã¯ã©ã¹ã®ããžãã¯ããããã«åæ§ç¯ããŸãã åºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ãæäœãããã¹ãŠã®ããžãã¯ãéåžžã®C ++ã¯ã©ã¹ã«ãŸãšããŸãã åºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã¯æœè±¡çã§ãªããªããã¯ã©ã¹ãªããžã§ã¯ãã¯ã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ã®éåžžã®ããžãã¯ãåãåããå€ãã³ããŒããŠå²ãåœãŠãããšãã§ããŸãããæãéèŠãªããšã¯ããã€ãã¹ãåãé€ãããšã§ä»¥åã®ã¢ãããŒãã®ãã¹ãŠã®å©ç¹ã倱ããªãããšã§ãïŒ
èšãæãããšãåºæ¬ã¯ã©ã¹ã¯ããã®åäœãåºæ¬ã¯ã©ã¹ã®ããŒã¿ã¯ã©ã¹ããç¶æ¿ãããåŸç¶ã¯ã©ã¹ã«ãã£ãŠæ±ºå®ãããã¯ã©ã¹ã®åœ¢åŒã§ããã€ãã®ããŒã¿ãåãåããŸã...çŽããããããã«èãããŸããïŒ æ¬¡ã«äŸãèŠãŠã¿ãŸãããããã¹ãŠãæããã«ãªããŸãã
åºæ¬ã¯ã©ã¹ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«äŒŒãã¯ã©ã¹ã®åœ¢åŒã§ããŒã¿ãåãåããŸããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®åäœã¯ãçžç¶äººã®ããŒã¿ã¯ã©ã¹ã«ãã£ãŠæ±ºå®ãããŸãã ç¶æ¿ã¯2ã€ãããŸããããŒã¿ã¯ã©ã¹ãç¶æ¿ãããŸã
// API class object { public: object(); virtual ~object(); virtual bool is_null() const; virtual std::string to_string() const; protected: // ! class data; private: std::shared_ptr<data> m_data; }; // API // #include class object::data { public: data() { } virtual ~data() { } virtual bool is_null() const { return true; } virtual std::string to_string() const { return "null"; } }; // API // , object class flower : public object { public: flower(std::string const& name); virtual bool is_null() const override; virtual std::string to_string() const override; virtual std::string name() const; virtual void rename(std::string const& name); protected: // ! class data; }; // API // #include class flower::data : public object::data { public: static const std::string FLOWER_UNKNOWN; data() : m_name(FLOWER_UNKNOWN) { } data(std::string const& name) : m_name(name) { } virtual bool is_null() const override { return false; } virtual std::string to_string() const override { return "flower: " + m_name; } virtual std::string name() const { return m_name; } virtual void rename(std::string const& name) { m_name = name; } private: std::string m_name; };
å®éãéåžžã¯çžç¶äººãå€ããéåžžã¯äŸåã©ã€ãã©ãªã«è¡šç€ºãããŸãã 次ã«ããã®æ¥œãããã¶ã€ã³ã§äœãã§ããã®ããç解ããŸãã
object rose = flower("rose"); object none; std::vector<object> garden; garden.push_back(std::move(rose)); garden.push_back(std::move(none)); garden[1] = flower("gladiolus"); std::for_each(garden.begin(), garden.end(), [](object const& element) { std::cout << element.to_string() << std::endl; } );
APIã¯ã©ã¹ã¡ãœããã®å®è£ ã¯æããã§ãããããŒã¿æäœã¡ãœããããããã·ããŸãã ç¥å ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããŒã¿ãäœæãããnullãã€ã³ã¿ãŒãæ®ããŸããçžç¶äººã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãç®çã®åã®ããŒã¿ã®çžç¶äººã§ç¥å ã®ãã€ã³ã¿ãŒãåæåããŸãã
ãªããžã§ã¯ãã¯ã©ã¹ã®æ°ããåå«ãäœæããŠãæååã«å€æããŠå€ããã§ãã¯ããããžãã¯ã«èšå®ããããšã劚ãããã®ã¯äœããããŸããã ããšãã°ãéŽã®ãã£ãŒãã£ã¯ã©ã¹ãéžæã§ããŸãã
class shoes { public: shoes(long long price); virtual bool is_null() const override; virtual std::string to_string() const override; virtual long long price() const; virtual void discount(long long price); protected: class data; };
shoes ::ããŒã¿ã¯ã©ã¹ã¯ãflower ::ããŒã¿ãšã®é¡æšã«ãã£ãŠèšè¿°ãããŸãã 確ãã«ãåã®äŸããè±ã䜿ã£ãŠåºãæäœãããšãé¢çœãçµæãåŸãããŸãã
garden.push_back(shoes(100000000000LL));
ãããã£ãŠãåºã«1000åã«ãŒãã«ã®éŽãæ®ãããšãã§ããŸãã ãŸãããããã®éŽã§ã¯ãäžæ³šæã§ã€ãŸãããè±ãåé¡ããŸãããåºæ¬ã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããåæã¢ãããŒãã§ãåãåé¡ã«çŽé¢ããŸãã åºã«è±ã ããããããšãæå³ããå Žåãstd :: vectorãäœæããŸãã ã©ããããã³ãŒãã®äœæè ã¯ãè±ãéŽããååçããšãžããã®ãã©ããããªã©ãæªç¥ã®ãŽããŸã§ãåºã«äœã§ãä¿ç®¡ããããšã«æ±ºããŸããã
å žåçãªããžãã¯ãæã€éåžžã®C ++ã¯ã©ã¹ã䜿çšããåçåä»ãã®äžçãžããããã ãããïŒ ã¯ã©ã¹ãã³ããŒãããšããªã³ã¯ãã³ããŒãããã ãã§ãã C ++ã¯ã©ã¹ããžãã¯ãšã®ææ°ã®ççŸãä¿®æ£ããŸãã
ãªããžã§ã¯ããå€æŽãããšãã«ã³ããŒãã
åºæ¬ãªããžã§ã¯ãã¯ãå ã®ã€ã³ã¿ãŒãã§ã€ã¹ãCloneã¡ãœããã§å®è¡ããããšãã€ãŸããç¶æ¿è ã®ã³ã³ãã³ããã³ããŒããããšãåŠç¿ãããšãã§ãã åæã«ãã³ããŒã¯ã§ããéãæ§ããã«ããŠãããŒã¿ãã§ããã ãé ãã³ããŒããå¿ èŠããããŸãã ãã®æ¡ä»¶ã¯ããªããžã§ã¯ãã倧ãããªãããã®ã³ããŒãæ瀺çãŸãã¯æé»çã«éäžããã»ã©ãããé倧ã«ãªããŸãã ããã§ã¯ããªããžã§ã¯ãã®ããŒã¿ãå€æŽããéã®ã³ããŒã®ååã圹ç«ã¡ãŸãã
C ++ã§ã®å€æŽæã³ããŒããŸãã¯ã³ããŒãªã³ã©ã€ãïŒCOWïŒã¯æ¯èŒçåçŽã§ããããšãã°ãæååïŒQStringïŒãå«ãã©ãã§ãCOWã䜿çšãããQtã©ã€ãã©ãªã¯ããããã®ãªããžã§ã¯ããå¿ èŠãªãã®ã«ã³ããŒããã³ã¹ããåæžããŸãæå°ã
ã¢ãããŒãã®æ¬è³ªã¯æ¬¡ã®ãšããã§ãã
- ãªããžã§ã¯ãã¯ããã€ã³ã¿ã®ãããªè£å©åãä»ããŠããŒã¿ãåç §ããŸãã
- ãªããžã§ã¯ãã¡ãœããã¯constããã³non-constã«ã§ããŸããã次ã®ç¹ã«ãããã¡ãœããã®äžè²«æ§ãæ確ã«ç¶æããããšãéèŠã§ãã
- ãªããžã§ã¯ãã¡ãœãããåŒã³åºããšããåŒã³åºãã¯æåã®ã¢ã€ãã ããåãè£å©ãã€ã³ã¿åãä»ããŠããŒã¿ã¯ã©ã¹ã¡ãœãããåŒã³åºãããã«ãããã·ãããŸãããã®ç®çã®ããã«ã2ã€ã®æŒç®å->ããªãŒããŒããŒããããããããèªã¿ããããconstããã³non-constã«ãªããŸãã
å®æ°ããŒãžã§ã³ã®operator->ãªãŒããŒããŒãã¯ãå¿ èŠãªã¡ãœãããããŒã¿ã¯ã©ã¹ã§çŽæ¥åŒã³åºããå€éšã¯ã©ã¹ãžã®åŒã³åºãããããã·ããã ãã§ãã
æŒç®å->ãªãŒããŒããŒãã®éå®æ°ããŒãžã§ã³ã¯ããå°ãèå³æ·±ããã®ã§ãåŒã³åºããããŒã¿ãå€æŽããããšãæå³ããŸãã ãããã£ãŠãå€æŽå¯èœãªããŒã¿ãåç §ããããšã確èªããå¿ èŠããããŸãã ããŒã¿ãžã®ãªã³ã¯ãäžæã§ãªãå Žåãã€ãŸããã³ããŒã延æããŠä»ã®äººã®ããŒã¿ãåç §ããå Žåã¯ãç¬èªã®ããŒã¿ã®ã³ããŒãã³ããŒããç®çã®ã¡ãœãããåŒã³åºããŠäœæ¥ããå¿ èŠããããŸãã
C ++ã®å€æŽæã®ã³ããŒã¯ãæŒç®å->ã«ãã»ã«åããããã«ããŒã¯ã©ã¹ã®ãªãŒããŒããŒãã«ãããæ¯èŒçç°¡åã§ãã constæŒç®åãšéconstæŒç®åã®äž¡æ¹ã®ãªãŒããŒããŒãããªãŒããŒããŒãããããšãéèŠã§ã
æ確ã«ããããã«ããã®ãããªäžéåç §åã®æãåçŽåãããããŒãžã§ã³ãååŸããŸãããã
template <class data_type> class copy_on_write { public: copy_on_write(data_type* data) : m_data(data) { } data_type const* operator -> () const { return m_data.get(); } data_type* operator -> () { if (!m_data.unique()) m_data.reset(new data_type(*m_data)); return m_data.get(); } private: std::shared_ptr<data_type> m_data; };
è¯ãæ¹æ³ã§ã¯ãã³ããŒããã»ã¹äžã®äŸå€ã«å¯ŸããŠã ãã§ãªãããã«ãã¹ã¬ããã¢ã¯ã»ã¹ã®ããã«ãã®ã¯ã©ã¹ãä¿è·ããå¿ èŠããããŸãããååãšããŠãã¯ã©ã¹ã¯C ++ã§COWãå®è£ ããåºæ¬çãªèãæ¹ãäŒããã®ã«åååçŽã§ãã ãŸããã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãããŒã¿ã¯ã©ã¹ã¯ããŒã¿ãè€è£œããããã®ä»®æ³ã¡ãœããã®åŒã³åºããæå³ããããšãèæ ®ãã䟡å€ããããŸãã
ããšã¯ãåºæ¬ã¯ã©ã¹ãªããžã§ã¯ãã®ããŒã¿ã¹ãã¬ãŒãžãå€æŽããã ãã§ãã
class object { ... protected: class data; private: copy_on_write<data> m_data; };
ãããã£ãŠãåºæ¬ã¯ã©ã¹ãšäºææ§ã®ããçžç¶äººã®ã¯ã©ã¹ã®åæåãã€ãŸãå®éã«ã¯åçåä»ããååŸããŸãã ããã«ãæœè±¡ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒãæäœããŸãããã³ã³ã¹ãã©ã¯ã¿ãŒããã¹ãã©ã¯ã¿ãŒãã³ããŒãããã³å²ãåœãŠãåããéåžžã®C ++ã¯ã©ã¹ããããç¬èªã®åå«ãäœæããããã«ã§ããã ãç°¡åã§ãã å¯äžã®è€éãªåé¡-ãããã·ã¡ãœããïŒm_data->ã¡ãœããïŒåŒæ°ïŒã«ççž®ïŒã¯ãåŒã³åºãèªäœã«å ããŠãã¹ã¿ãã¯ãã¬ãŒã¹ãªã©ã®èšºææ å ±ãä¿åã§ãããããåŒã³åºãã®ã·ãŒã±ã³ã¹ãç¶æããªãããšã©ãŒã®è¿œè·¡ãšäŸå€ã®ã¹ããŒãç°¡åã«ã§ããããããã©ã¹ã«ãªããŸãäŸå€ãã¹ããŒããã¡ãœããã
å®éãããŒã¿ãåçã«åæå®ããããã®PimplãšDoubleã®ãã£ã¹ãããã¢ãããŒãã®ãã€ããªããããããå®è¡æã«åãååŸããŸãã
å®éãåçããŒã¿åä»ãã®ããã®PimplãšDoubleãã£ã¹ãããã¢ãããŒãã®ãã€ããªãããååŸããŸãã
ããŒã¿ã¯ã©ã¹ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŸããïŒ
ããŒã¿ã¯ã©ã¹ãå®è£ ããå ŽåãPimplãã¿ãŒã³ã§è¡ãããŠããããã«ãå€éšã¯ã©ã¹ã®ãã¹ãŠã®ã¡ãœãããè€è£œããå¿ èŠã¯ãããŸããã ããŒã¿ã¯ã©ã¹ã¯2ã€ã®äž»ãªã¿ã¹ã¯ãå®è¡ããŸããå®è£ ã®ã«ãã»ã«åã®è©³çŽ°ãé ããå€éšã¯ã©ã¹ã®ã¡ãœããã®å®è£ ã§ããŒã¿ãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã get_ããã³set_ã¡ãœãããšããã€ãã®è£å©æ©èœãäœæããå€éšã¯ã©ã¹ã®ã¡ãœããã§ããŒã¿åŠçãçŽæ¥å®è¡ããã ãã§ååã§ãã ãããã£ãŠãã¯ã©ã¹ã®å®è£ ãšã«ãã»ã«åã®è©³çŽ°ãåé¢ããŸãã
ãã€ãããã¯ã¿ã€ãã³ã°ã®äœ¿çš
ãã®ããããªãã·ã§ã³ãšããŠãªã¢ãŒãé¢æ°åŒã³åºããããã³ã«ããããšããŸããããã¯ãããŒã¿ããŒã¹ãžã®SQLã¯ãšãªã®ãã©ã¡ãŒã¿ãŒåã§ãã ãšã³ããŠãŒã¶ãŒã«APIãæäŸããäžè¬çãªã¡ã«ããºã ãäœæããå Žåãå®è¡æã«åŒæ°ã®ã¿ã€ããšçµæãèšç®ããŸããããã¯ããŠãŒã¶ãŒãåŒæ°ãšããŠæž¡ããã®ãšãªã¢ãŒãåŽããåãåãçµæã®ã¿ã€ããäºåã«ããããªãããã§ããªããªããäžé£ã®åŒã³åºãã§ã¯ã次ã®åŒã³åºãã®åŒæ°ã¯ãã°ãã°åã®åŒã³åºãã®çµæã«åºã¥ããŠããããã§ãã
ãã®ãããªå Žåãåºæ¬ã¯ã©ã¹ãçžç¶äººã®ã€ã³ã¿ãŒãã§ãŒã¹ã ãã§ãªããçžç¶äººããŒã¿ã®ã³ã³ããã§ãããå ŽåãC ++ã¯ã©ã¹ããã³ãªããžã§ã¯ãã«é¢ããŠåçåä»ããå¿ èŠãšããæ©èœãèšè¿°ããæ©äŒãåŸãããŸãã
SQLã¯ãšãªã®äŸãèããŠã¿ãŸãããã èŠæ±ãå®è¡ããããã®åŒæ°ã®ãªã¹ãã¯ããªããžã§ã¯ãåã®åŒæ°ã®ä»»æã®æ°ã®é¢æ°ã«å¯ŸããŠåãBoost.Preprocessorã«ãã£ãŠçæã§ããŸãã
// SQL-, db::SqlQuery db::SqlQuery query("select * from users as u where u.type = $(usertype) and u.registered >= $(datetime) limit 10"); // operator () db::SqlQueryResult result = query("admin", datetime::today()); // std::for_each(result.begin(), result.end(), [](db::SqlQueryRow const& row) { // object login = row["login"]; if (login.is_null()) std::cout << "not specified"; else std::cout << row["login"]; // if (row["status"] == "deleted") std::cout << " (deleted)"; std::cout << std::endl; } );
db :: SqlQuery :: operatorïŒïŒãžã®åŒæ°ãšããŠããªããžã§ã¯ãã®ä»»æã®ã»ããã䜿çšã§ããŸãããã®å Žåãåãäžè¬åãªããžã§ã¯ãã«ãã£ã¹ãããããã®ãã³ãã¬ãŒãæé»ã³ã³ã¹ãã©ã¯ã¿ãŒãå®çŸ©ããå¿ èŠããããŸãã
class object { public: template <typename value_type> object(value_type const& value); ... };
ãã®å Žåãintegerãbooleanãfloatingãtextãdatetimeãªã©ã®åœ¢åŒã®ãªããžã§ã¯ãã¯ã©ã¹ããã®ç¶æ¿è ãå¿ èŠã§ãããªããžã§ã¯ãã®ããŒã¿ã¯ããªããžã§ã¯ãã察å¿ããå€ã§åæåããããšãã«ãªããžã§ã¯ãã«é 眮ãããŸãã ãã®å Žåããªããžã§ã¯ããä»»æã®åã§åæåããããšã¯æ¡åŒµå¯èœã§ããããªããžã§ã¯ããç®çã®åã«èšå®ããããã«å¿ èŠãªã®ã¯ãboolã®ããã«ã察å¿ããç¹æ®åãèšè¿°ããããšã ãã§ãã
class boolean { public: boolean(bool value) : object(value) { } ... protected: class data; friend class object; }; template<> object::object(bool value) : m_data(new boolean::data(value)) { }
ããã§æãéèŠãªããšã¯ç°ãªããŸããã¯ãšãªã®çµæã¯ãå®è¡æã«ããŒã¿ããŒã¹ã®ãªã¢ãŒãåŽã§èšç®ãããããŒã¿ãå«ãããŒãã«ã§ãã ãã ããã¯ãšãªçµæã®ãã¹ãŠã®è¡ãå®å šã«åŠçããŠãéã·ãªã¢ã«åãããŠããªãããŒã¿ã§ã¯ãªããéåžžã«ç¹å®ã®ã¿ã€ãã®ãªããžã§ã¯ããååŸã§ããŸãã ãªããžã§ã¯ããæäœããããæ¯èŒæäœããªãŒããŒããŒãããããã³ã³ã¹ãã©ã¯ã¿ãŒãšã®é¡æšã«ãã£ãŠç¹å®ã®åã®å€ãååŸããããã®ãã³ãã¬ãŒãã¡ãœãããäœæããããæååã«æã£ãŠããŠã¹ããªãŒã ã«å ¥ãããããããšãã§ããŸãã ãªããžã§ã¯ãåã®ãªããžã§ã¯ãã¯ãéåžžã®ã¯ã©ã¹ãªããžã§ã¯ããšããŠæäœã§ããã³ã³ããã§ãã
ããã ãã§ãªããå¿ èŠã«å¿ããŠãã³ã³ããã®ããžãã¯ããªããžã§ã¯ãã«è¿œå ãããªã¯ãšã¹ãããè¿ãããå€ã«å¯ŸããŠ1ã€ã®ã¿ã€ãã ããå®è¡ã§ããŸãã ã€ãŸããbeginïŒïŒãendïŒïŒãsizeïŒïŒãããã³operator []ã¡ãœããããªãŒããŒããŒãããŸãã
object result = query("admin", datetime::today()); std::for_each(result.begin(), result.end(), [](object const& row) { std::for_each(row.begin(), row.end(), [](object const& cell) { std::cout << cell.to_string() << ' '; } std::cout << std::endl; } );
ååãšããŠãã³ã³ãããšåºæ¬ã¯ã©ã¹ãªããžã§ã¯ããä»ããŠäœã§ã䜿çšã§ããããã«ã¢ã€ãã¢ãæŽç·Žã§ããŸãããããã§ã¯åžžèãå¿ããŠã¯ãããŸããã ã³ã³ãã€ã«æ®µéã§ãšã©ãŒãæããã«ããéçåä»ãã®èãæ¹ã¯éåžžã«åªããŠãããåçåä»ãã軜çã«äœ¿çšã§ããå Žåã¯ã©ãã§ãæåŠããããšã¯éåžžã«äžåçã§ãã
ã³ã³ãã€ã«ã®æ®µéã§ãšã©ãŒãæ€åºããéçåä»ãã®ã¢ã€ãã¢ã¯éåžžã«åªããŠããããããã©ãã§ãæŸæ£ããããšã¯éåžžã«äžåçã§ãïŒ
ããã«ãããããããåçåä»ãã¯ãæå³ããããŸãã«ãã®å Žæã§éåžžã«æçšã§ã-éåžžã¯ããŒã¿ã¹ããªãŒã ã®è§£æã®çµæãšããŠåãåçã«ååŸãããå€ã«å¯ŸããŠã ããŸããŸãªåã®ããŒã¿ãæäœããããã«åºæ¬ã¯ã©ã¹ã«ã«ãã»ã«åãããã€ã³ã¿ãŒãã§ã€ã¹ã«ãããéåžžã®ã³ã³ã¹ãã©ã¯ã¿ãŒãšä»£å ¥æŒç®åã䜿çšããŠãªããžã§ã¯ããäœæããã³ã³ããŒããããšã«ãããéåžžã®C ++ãªããžã§ã¯ããæäœã§ããŸããã³ããŒãªã³ã©ã€ããã¯ããã¯ã䜿çšãããšãã³ããŒãå¯èœãªéãïŒçæ³çã«ã¯æ°žä¹ ã«ïŒå»¶æã§ããŸãã
åæã«ãåºæ¬ã¯ã©ã¹ã¯ãããŸããŸãªããŒã¿ãšã³ã³ãããŒãæäœããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã§ãã 䟿å®äžãæ¯èŒãã€ã³ããã¯ã¹ãæ°åŠããã³è«çæŒç®ããããŒã䜿çšããæŒç®ãªã©ãå¿ èŠãªãã¹ãŠã®æŒç®ãåºæ¬ã¯ã©ã¹ã«å®çŸ©ã§ããŸãã äžè¬ã«ãåºæ¬ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒã®ä¿åãããŸããŸãªã¹ããªãŒã ããã®ã³ããŒããã³ã¢ã¯ã»ã¹ã®ãšã©ãŒããæãä¿è·ãããŠãããæãèªã¿ãããè«ççãªã³ãŒããå®è£ ã§ããŸãã ããã¯ããã®APIãåºç¯å²ã®ã¿ã¹ã¯çšã«éçºãããæåã¯æªç¥ã®äžé£ã®ã¿ã€ããæäœãããšãã«ç¹ã«åœ¹ç«ã¡ãäžé£ã®ã¿ã€ãèªäœãæœåšçã«æ¡åŒµãããå¯èœæ§ããããŸãã
åçåä»ãã¯ããªãã®è²¬ä»»ã§ãïŒ
åçãªå ¥åãè¡ããšãã¯ãéåžžã«æ éã§ãªããã°ãªããŸããã ã¹ã¯ãªããèšèªã®éçºè ã¯ãã¢ã«ãŽãªãºã ãã³ã³ãã€ã«æ®µéã§å®è¡ãããåã§ãã£ãŠããåããã§ãã¯ããC ++ãCïŒãããã³Javaã®ãã¯ãŒããã°ãã°ããããããšãå¿ããªãã§ãã ããã éçåä»ãã®åã䜿çšããŠãæ£åœãªå Žåã«ã®ã¿æåŠããšãã¥ã¬ãŒãããŸãïŒ ååãšããŠããªã¢ãŒãã®ã·ãªã¢ã«åãããããŒã¿ãµãŒããŒã«å¯Ÿããäžè¬åãããAPIèŠæ±ïŒããŒã¿ããŒã¹èŠæ±ãå«ãïŒãå®è¡ããã«ã¯ãåçãªåæå®ãå¿ èŠã§ãã
éã·ãªã¢ã«åã®åŸãå®è¡æã«ãã§ã«å€ãã®åãååŸã§ããŸãã éåžžãããŒã¿ãåä¿¡ãããšãã«åŠçãå¿ èŠãªãããåçã«ååŸãããã¿ã€ããæåŠããããã¹ããŸãã¯ãã€ãã¹ããªãŒã ã«ã·ãªã¢ã«åãããããŒã¿ãåŠçããããšã¯æ£åœåã§ããŸããã ããŒã¿ã解æããŠäœ¿ãæ £ããC ++åãååŸããã€ã³ã¿ãŒãã§ã€ã¹ãã€ã³ã¿ãŒã§ã¯ãªããé©åã«èšèšãããã¯ã©ã¹ã®éåžžã®ãªããžã§ã¯ãã䜿çšããããšã®å©äŸ¿æ§ã¯ã貎éã§ãã
æ°ããæ¹æ³
, , API C++ , RPC- . , , . , , . copy-on-write operator -> const non-const , , , , . , , , . new â .
, , . , , - , . . , Pimpl, , .
API, C++. , . , , - .
API , . , , â API, .

#189.
: Qualab , ++ Parallels
ããã«ãŒã賌èªãã