Contents
概要
ずいぶんこのコンテンツは古いです。。変な感じの記述は消去中ですが、まだまだ消去できてません。
オブジェクト指向言語の分類
オブジェクト指向言語と一言にいってもいろいろと分類ができます。
クラスベース
クラスからインスタンスを生成する、という視点で開発されたオブジェクト指向言語の事をクラスベースオブジェクト指向言語(Class Based Object Oriented Language)と呼称します。
Javaなどはこれにあたります。
プロトタイプベース
ある原形(プロトタイプ)からそれに機能を付加した実体を作成する、という視点で開発されたオブジェクト指向言語の事をプロトタイプベースオブジェクト指向言語(Prototype Based Object Oriented Language)と呼称します。
JavaScriptなどはこれにあたります。
まとめ
何か機能差があるかというと、それほどない場合が多いです。ただ視点が違うため、注意すべき点は多いです。
http://starry.night.nu/web/prog/javascript/c03_know_that_js_is_an_oopl.html
オブジェクト指向の嘘たち
勢いだけで書いてるので、内容はグダグダ。
オブジェクト指向では現実世界をモデル化する
どこぞで話題になったらしい。伝聞で聞いた、というか質問された。
これは当然嘘です。ってかだれもそんな事いってないと思う。そういう記述のある書籍って見た事ない。
オブジェクトの説明にたまたま現実の物を例にして説明している書籍は見た事あるけど、オブジェクト思考その物が現実をモデル化する物という記述をしているのは手元の書籍にはないのだが、実際にあるのでしょうか?
現実世界をモデル化しても意味ないです。我々は現実を解決するためにモデル化するのです。理想というか望む物をモデリングします。
既存システムをモデリングしないのか?という疑問があるかもしれませんが、一部はしてもそれはあくまでも理想を作成するための作業にすぎません。
理想の世界を現実の世界にマッピングするのがモデリングです。オブジェクト指向は理想をオブジェクトにマッピングする事で現実にマッピングしようとする事です。あくまでもモデル化するのは望む世界です。
ソフトウェア設計は医学と同じです。診断(現実の認知)が目的ではありません。診断は重要ですが過程の一部です。目的は治療です。
オブジェクトの識別は難しい
嘘です。オブジェクトの識別は難しくありません。業務や仕様を正確に理解したり抽出する事が難しいのです。
病気の人を正確に診断するのは知識があればある程度可能です。知識がなく、経験もないと確かに診断は難しいです。
正確な診断には病気の人に自分の症状を説明させる事です。医者は神様ではないので、正確な症状説明がないと診断にてまどる事があります。診断しても、どのように治りたいのかを患者に確認する必要があります。これがさらに難しい。治療の結果が患者に納得されないと。。。
また加えて難しいのは病気の人に自分が病気であると気づかせる事です。病院にさえこない人がいかに世の中に多い事か。。
また病気で来ても説明を十分にしないと、患者は治療に同意しません。患者の治りたいという意思は病気の治療において予想以上に重要です。
再利用性が高まる
そういうふうに設計して実装すればできるけど、漫然とやっても無理。
継承を多用すべき
ってかだれもいってないのでは?。継承は便利な場合もありますが、多用するとかでなく適材適所で利用しましょう。
その他
この時は若かった(ってそんなに前ではない罠)。今ではかなり違う説明になると思います。文章下手糞だな自分。もっとまとめて書けや。
モデリングサンプル
オブジェクト指向ソフトウェア開発においては小さなモデルでいくつかモデリングをする事がのぞましいです。
業務モデリングならば実際に存在する業務をモデリングするのが最初はいいでしょう。
- Amazon.co.jpのシステム
- 航空券販売サイト
- 出会い系サイト
などは具体例が多いのでモデリングしやすいかもしれません。
参考書籍
--> -->SyntaxError
Non-ASCII character '\xa5' in file /home/ubuntu/prj/moindata/data/plugin/macro/ISBN.py on line 22, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details (ISBN.py, line 22)
If you want to report a bug, please save this page and attach it to your bug report.
Traceback
A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.
/home/ubuntu/prj/sakitojp/moin/MoinMoin/request.py in run (self=<MoinMoin.request.RequestWSGI object>)
- 1205 self.page.send_page(self, msg=msg)
- 1206 else:
- 1207 handler(self.page.page_name, self)
- 1208
- 1209 # generate page footer (actions that do not want this footer use
- handler = <function do_recall>
- self = <MoinMoin.request.RequestWSGI object>
- self.page = <MoinMoin.Page.Page instance>
- self.page.page_name = u'\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411'
/home/ubuntu/prj/sakitojp/moin/MoinMoin/wikiaction.py in do_recall (pagename=u'\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411', request=<MoinMoin.request.RequestWSGI object>)
- 444 except KeyError:
- 445 rev = 0
- 446 Page(request, pagename, rev=rev).send_page(request)
- 447 else:
- 448 Page(request, pagename).send_page(request)
- global Page = <class MoinMoin.Page.Page>
- request = <MoinMoin.request.RequestWSGI object>
- pagename = u'\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411'
- rev = 20
- ).send_page undefined
/home/ubuntu/prj/sakitojp/moin/MoinMoin/Page.py in send_page (self=<MoinMoin.Page.Page instance>, request=<MoinMoin.request.RequestWSGI object>, msg=u'<strong>Revision 20 as of 2004-06-30 01:04:17</strong><br>', **keywords={})
- 1254 format_args=pi_formatargs,
- 1255 do_cache=do_cache,
- 1256 start_line=pi_lines)
- 1257
- 1258 # check for pending footnotes
- start_line undefined
- pi_lines = 1
/home/ubuntu/prj/sakitojp/moin/MoinMoin/Page.py in send_page_content (self=<MoinMoin.Page.Page instance>, request=<MoinMoin.request.RequestWSGI object>, Parser=<class MoinMoin.parser.wiki.Parser>, body=u'[[TableOfContents]]\n\n= \u6982\u8981 =\n\u305a\u3044\u3076\u3093\u3053\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u53e4\u3044\u3067\u3059\u3002\u3002\u5909\u306a...ifty.com/akon/main.html\n\n----\nCategoryPrograming\n', format_args='', do_cache=1, **kw={'start_line': 1})
- 1341
- 1342 if not (do_cache and self.canUseCache(Parser)):
- 1343 self.format(parser)
- 1344 else:
- 1345 try:
- self = <MoinMoin.Page.Page instance>
- self.format = <bound method Page.format of <MoinMoin.Page.Page instance>>
- parser = <MoinMoin.parser.wiki.Parser instance>
/home/ubuntu/prj/sakitojp/moin/MoinMoin/Page.py in format (self=<MoinMoin.Page.Page instance>, parser=<MoinMoin.parser.wiki.Parser instance>)
- 1365 def format(self, parser):
- 1366 """ Format and write page content without caching """
- 1367 parser.format(self.formatter)
- 1368
- 1369 def execute(self, request, parser, code):
- parser = <MoinMoin.parser.wiki.Parser instance>
- parser.format = <bound method Parser.format of <MoinMoin.parser.wiki.Parser instance>>
- self = <MoinMoin.Page.Page instance>
- self.formatter = <MoinMoin.formatter.text_html.Formatter instance>
/home/ubuntu/prj/sakitojp/moin/MoinMoin/parser/wiki.py in format (self=<MoinMoin.parser.wiki.Parser instance>, formatter=<MoinMoin.formatter.text_html.Formatter instance>)
- 1098
- 1099 # Scan line, format and write
- 1100 formatted_line = self.scan(scan_re, line)
- 1101 self.request.write(formatted_line)
- 1102
- formatted_line = u'<p class="line867">\n<h1 id="head-8a742a7e5f6ce3fc264e91b3e900c2ca1bacbfdd">\u53c2\u8003\u66f8\u7c4d</h1>\n'
- self = <MoinMoin.parser.wiki.Parser instance>
- self.scan = <bound method Parser.scan of <MoinMoin.parser.wiki.Parser instance>>
- scan_re = <_sre.SRE_Pattern object>
- line = u'[[ISBN(4756100503 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u5165\u9580)]] '
/home/ubuntu/prj/sakitojp/moin/MoinMoin/parser/wiki.py in scan (self=<MoinMoin.parser.wiki.Parser instance>, scan_re=<_sre.SRE_Pattern object>, line=u'[[ISBN(4756100503 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u5165\u9580)]] ')
- 874 self.in_table or self.in_list):
- 875 result.append(self.formatter.paragraph(1, css_class="line867"))
- 876 result.append(self.replace(match))
- 877 lastpos = match.end()
- 878
- result = ['<p class="line867">']
- result.append = <built-in method append of list object>
- self = <MoinMoin.parser.wiki.Parser instance>
- self.replace = <bound method Parser.replace of <MoinMoin.parser.wiki.Parser instance>>
- match = <_sre.SRE_Match object>
/home/ubuntu/prj/sakitojp/moin/MoinMoin/parser/wiki.py in replace (self=<MoinMoin.parser.wiki.Parser instance>, match=<_sre.SRE_Match object>)
- 903 # Get replace method and replece hit
- 904 replace = getattr(self, '_' + type + '_repl')
- 905 result.append(replace(hit))
- 906 return ''.join(result)
- 907 else:
- result = []
- result.append = <built-in method append of list object>
- replace = <bound method Parser._macro_repl of <MoinMoin.parser.wiki.Parser instance>>
- hit = u'[[ISBN(4756100503 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u5165\u9580)]]'
/home/ubuntu/prj/sakitojp/moin/MoinMoin/parser/wiki.py in _macro_repl (self=<MoinMoin.parser.wiki.Parser instance>, word=u'[[ISBN(4756100503 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u5165\u9580)]]')
- 848 if self.macro is None:
- 849 self.macro = wikimacro.Macro(self)
- 850 return self.formatter.macro(self.macro, macro_name, args)
- 851
- 852 def scan(self, scan_re, line):
- self = <MoinMoin.parser.wiki.Parser instance>
- self.formatter = <MoinMoin.formatter.text_html.Formatter instance>
- self.formatter.macro = <bound method Formatter.macro of <MoinMoin.formatter.text_html.Formatter instance>>
- self.macro = <MoinMoin.wikimacro.Macro instance>
- macro_name = u'ISBN'
- args = u'4756100503 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u5165\u9580'
/home/ubuntu/prj/sakitojp/moin/MoinMoin/formatter/base.py in macro (self=<MoinMoin.formatter.text_html.Formatter instance>, macro_obj=<MoinMoin.wikimacro.Macro instance>, name=u'ISBN', args=u'4756100503 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u5165\u9580')
- 288 def macro(self, macro_obj, name, args):
- 289 # call the macro
- 290 return macro_obj.execute(name, args)
- 291
- 292 def _get_bang_args(self, line):
- macro_obj = <MoinMoin.wikimacro.Macro instance>
- macro_obj.execute = <bound method Macro.execute of <MoinMoin.wikimacro.Macro instance>>
- name = u'ISBN'
- args = u'4756100503 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u5165\u9580'
/home/ubuntu/prj/sakitojp/moin/MoinMoin/wikimacro.py in execute (self=<MoinMoin.wikimacro.Macro instance>, macro_name=u'ISBN', args=u'4756100503 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u5165\u9580')
- 108 self.name = macro_name
- 109 try:
- 110 execute = wikiutil.importPlugin(self.cfg, 'macro', macro_name)
- 111 except wikiutil.PluginMissingError:
- 112 try:
- execute undefined
- global wikiutil = <module 'MoinMoin.wikiutil' from '/home/ubuntu/prj/sakitojp/moin/MoinMoin/wikiutil.pyc'>
- wikiutil.importPlugin = <function importPlugin>
- self = <MoinMoin.wikimacro.Macro instance>
- self.cfg = <sakito.Config instance>
- macro_name = u'ISBN'
/home/ubuntu/prj/sakitojp/moin/MoinMoin/wikiutil.py in importPlugin (cfg=<sakito.Config instance>, kind='macro', name=u'ISBN', function='execute')
- 802 """
- 803 try:
- 804 return importWikiPlugin(cfg, kind, name, function)
- 805 except PluginMissingError:
- 806 return importBuiltinPlugin(kind, name, function)
- global importWikiPlugin = <function importWikiPlugin>
- cfg = <sakito.Config instance>
- kind = 'macro'
- name = u'ISBN'
- function = 'execute'
/home/ubuntu/prj/sakitojp/moin/MoinMoin/wikiutil.py in importWikiPlugin (cfg=<sakito.Config instance>, kind='macro', name=u'ISBN', function='execute')
- 815 raise PluginMissingError
- 816 moduleName = '%s.plugin.%s.%s' % (cfg.siteid, kind, name)
- 817 return importNameFromPlugin(moduleName, function)
- 818
- 819
- global importNameFromPlugin = <function importNameFromPlugin>
- moduleName = u'sakito.plugin.macro.ISBN'
- function = 'execute'
/home/ubuntu/prj/sakitojp/moin/MoinMoin/wikiutil.py in importNameFromPlugin (moduleName=u'sakito.plugin.macro.ISBN', name='execute')
- 834 Raise PluginAttributeError if name does not exists.
- 835 """
- 836 module = __import__(moduleName, globals(), {}, [name])
- 837 try:
- 838 return getattr(module, name)
- module undefined
- builtin __import__ = <built-in function __import__>
- moduleName = u'sakito.plugin.macro.ISBN'
- builtin globals = <built-in function globals>
- name = 'execute'
SyntaxError
Non-ASCII character '\xa5' in file /home/ubuntu/prj/moindata/data/plugin/macro/ISBN.py on line 22, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details (ISBN.py, line 22)
- args = (r"Non-ASCII character '\xa5' in file /home/ubuntu/... http://python.org/dev/peps/pep-0263/ for details", ('/home/ubuntu/prj/moindata/data/plugin/macro/ISBN.py', 22, 0, None))
- filename = '/home/ubuntu/prj/moindata/data/plugin/macro/ISBN.py'
- lineno = 22
- message = ''
- msg = r"Non-ASCII character '\xa5' in file /home/ubuntu/... http://python.org/dev/peps/pep-0263/ for details"
- offset = 0
- print_file_and_line = None
- text = None
System Details
- Date: Thu, 28 Mar 2024 21:17:58 +0000
- Platform: Linux sakitojp 5.4.0-1060-aws #63~18.04.1-Ubuntu SMP Mon Nov 15 14:31:31 UTC 2021 x86_64
- Python: Python 2.7.17 (/opt/uwsgi/bin/uwsgi2)
- MoinMoin: Release 1.5.9 (release)