質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

2回答

5400閲覧

シングルトンは、static おじさんより何が良いのか

todayske

総合スコア38

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

2クリップ

投稿2020/05/26 00:58

編集2020/05/26 01:47

全て static な関数や変数のクラスと比較して、シングルトンは何が有利なのでしょうか。

「static おじさん」という言葉を聞いたことがあるのですが、static おじさん的な書き方の方がコード量が少なくて済んで、かっこいいおじさんのように思えてしまいます。

Dart

1// コード量 : 多い 2class SingletonGuy { 3 static final SingletonGuy _singleton = SingletonGuy._internal(); 4 factory SingletonGuy() => _singleton; 5 SingletonGuy._internal(); 6 7 void saySomething(){ 8 print('Why do I live?'); 9 } 10} 11 12// コード量 : 少ない 13class StaticOjisan { 14 static void saySomething(){ 15 print('I am simple.'); 16 } 17} 18 19main() { 20 SingletonGuy().saySomething(); 21 StaticOjisan.saySomething(); 22}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/05/26 01:12

シングルトンやグローバル変数を多用する人はスタティックおじさんの同類です。どちらが良いということはありません。
guest

回答2

0

ベストアンサー

シングルトン(Singleton)はご存じのようにデザインパターンのひとつで、唯一無二の存在(インスタンス)を実現するための仕組みです。その仕組みを実現する実装の為にstaticを使っているだけで、安易な設計と実装にするためにstaticな関数、変数のみを使っているプログラムとは一線を画しているはずです。ただ、staticな関数、変数のみを使っているプログラムが即、悪いプログラムとは限らず、そのようなプログラムではオブジェクト指向やデザインパターンの適用は過剰スペックになることもあります。

「staticおじさん」とはいわば蔑称で、「オブジェクト指向でのカプセル化などのメリットを理解せず、周囲にもオブジェクト指向で**"作らない"**ことを強要する」ような人を指すものでもあると思います。そちらの方が恐らく有害で、気を付けるべきものかもしれません。適材適所です。


追記しました:
なお、シングルトンの考え方が適用されたクラスでも全てのメソッドがstaticな訳ではありません。各種APIで「クラス名.getInstance()」のようなかたちでインスタンスオブジェクトが取得できるものがありますが、不適切なコンテキストでインスタンス化しないよう配慮されたもので、これらもシングルトンと言えるでしょう。多くの場合でインスタンスメソッドが使えます。

投稿2020/05/26 01:49

編集2020/05/26 02:09
dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

todayske

2020/05/26 02:34 編集

ご返信ありがとうございます! > 「オブジェクト指向でのカプセル化などのメリットを理解せず、周囲にもオブジェクト指向で"作らない"ことを強要する」ような人 これは確かによくないと思いました。 適材適所というご回答についてなのですが、例えばどのような場合に、static な関数・変数よりもシングルトンパターンの方が有利になるのでしょうか?
dodox86

2020/05/26 02:52

> 例えばどのような場合に、static な関数・変数よりもシングルトンパターンの方が有利になるのでしょうか? 有利というか、動作責任の所在を明確にするために使います。私個人的な意見を含みますが、大量のソースコードを有するプロジェクトやフレームワーク、APIで、そのインスタンスを唯一無二の存在としてそのフレームワークやAPIのユーザー(プログラマー)に扱わせたいような場合です。勝手にインスタンス化すると整合が取れなくなるようなケース、例えば何らかの特殊な作業を行う単一のプロセスやスレッドをシングルトンのクラスに持たせるようなケースが思い浮かびます。シングルトンは往々にして単体テストがしづらいので、私自身は余程のことが無い限り使いませんが。
dodox86

2020/05/26 03:04

簡単にメリットを言うとすればその名のとおり「このクラスのインスタンスは唯一無二。」と明示的である、ということでしょうか。デザインパターンのひとつ、シングルトンを使うということは、そのコードを読んだ人がシングルトンと言うデザインパターンを知っているかぎり、その目的を素直に理解することができるはずですし、そのようにコードを実装すべきです。無作為にstaticな変数、関数を使うよりは責任範囲が明らかですし、デザインパターンとしての用途にも合致します。
todayske

2020/05/26 03:28

なるほど、ありがとうございます! コードを読む人 (自分を含めて) への意図の伝達、のような側面もあるということだと理解しました。
guest

0

「static おじさん」という言葉を聞いたことがあるのですが、static おじさんのどこが問題なのか分からず

「static おじさん」は、シングルトンと比較してのものではありません。インスタンスを作らずに、ひたすらstaticでコードを書いていく行為を指します。

投稿2020/05/26 01:00

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

todayske

2020/05/26 01:49

誤解を招く表現ですみません。。 それは一応理解していたつもりで、ユーモアとしてそのような表記をとっていただけでした、、
maisumakun

2020/05/26 01:51

質問の本命は「staticとシングルトンの比較」だったということでしょうか?
todayske

2020/05/26 02:29

そうだと思います!
maisumakun

2020/05/26 02:50 編集

staticなフィールドはクラスのロード時に初期化されますが、シングルトンをメソッドで取得する場合、初期化を実際の取得時まで遅らせることが可能です。
todayske

2020/05/26 03:25

経験不足で現実にその違いが活きてくるイメージができていないのですが、理論的には理解できたと思います! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問