ネタ元: http://twitter.com/hi_saito/status/1524994613
の元ネタ: http://d.hatena.ne.jp/mzp/20090414/hello
のさらに元ネタ: http://d.hatena.ne.jp/Yuichirou/20090414#1239705258
を、見ていたのですが、激しい違和感が...
一番元ネタの設計を日本語で表すと概ね以下のようになると思います。
- ようこそ は名前を持っています
- ようこそ に喋れ(say)というと "こんにちは"に続いて名前を印字します
- オブジェクト指向的HelloWorldとは ようこそ に「世界」という名前を与え、喋らせることです。
何か違わないか?
というわけで、自分なりに オブジェクト指向的HelloWorldを再設計してみた
- 挨拶 は挨拶文を持っています
- 挨拶 に挨拶の相手を設定することが可能です
- 挨拶の相手は 印字可能であれば特に制約はありません
- 挨拶 に印字せよ(display/print) と言うと 挨拶文を印字し、続いて 挨拶の対象があればそれも印字します
- オブジェクト指向的HelloWorldとは、
- "Hello"という挨拶文を持つ挨拶に
- Worldを表すオブジェクトを挨拶の相手として設定し
- 印字せよ と言うことです。
んで、上記に基づいて C++ で オブジェクト指向的HelloWorldを実装してみた
#include <iostream>
#include <sstream>
#include <string>
class world
{
private:
world() {}
static world instance_;
public:
static world& instance() { return instance_; }
};
world world::instance_;
std::ostream&
operator<<(std::ostream& os, const world&)
{
os << "World";
return os;
}
class greeting
{
std::string content_;
std::string target_name_;
protected:
greeting(const std::string content)
: content_(content), target_name_() {}
public:
template <typename U>
greeting&
to(const U& target)
{
std::ostringstream oss;
oss << target;
target_name_ = oss.str();
return *this;
}
void
display() const
{
std::cout << content_;
if ( target_name_.length() > 0 )
std::cout << ", " << target_name_;
std::cout << "\n";
}
};
class hello
: public greeting
{
public:
hello() : greeting("Hello") {}
};
template <typename T>
void display(const T& t) { t.display(); }
int main()
{
display( hello().to(world::instance()) ); // Hello, World
display( hello().to("C++") ); // Hello, C++
display( hello() ); // Hello
return 0;
}
わざわざ display() 非メンバ関数を通してるのは、より英語の語順に近づけるためです。
また、worldがsingletonなのは、「世界は1つ」という概念の表れというかなんというか、まぁ気にするほどのことじゃない。





こんにちは、大本のネタを書いたYuichirouです。
「何か違わないか?」というご意見は全くその通りで、自分もあまり適切な例題ではないと思ってはいました。しかしまだ私、オブジェクト指向プログラミングについてまだ勉強中で、turuginaさんのお書きになられたコードも2割程度しか意味が理解できていない程度なものですから、あのような例題しか思いつかなかったという感じです。
また、私が狙ったのは典型的なクラスの構造が種々の言語でどのように書き表されるかを知ることであって、その中で具体的に行うことはあまり深く考えていなかったというのもあります。
何かオブジェクト指向プログラミングの初学者に適した、また他言語との記法の違いを見る上で適当な例題があればいいのですけどね……