我对面向对象编程中不同概念的命名有疑问
不试图通过一般手段来解释它,让我用两个我所说的不同概念的例子来说明它。
我认为说明这一点的好方法是如何处理游戏中的伤害免疫力。让我们谈谈火灾会损害走进它内部的实体。例如,假设有烈酒免受火灾影响,因此在行走时不应受到伤害。
有两种方法可以处理这种情况(实际上,有三种方法,但有一种方法非常有用'。我将在最后说明它是什么。)
首先,Entity类包含一个名为isImmuneToFire的布尔方法/属性,负责处理损坏过程的Fire类中的方法是检查它。如果此布尔值为true,则返回该方法,否则,在实体类中调用方法damageBy(amount,source)。
其次,Fire内部的伤害处理方法只是调用damageBy(amount,source)。关于免疫力的一切都只是在实体类的方法的单独实现中处理。它更像是将免疫处理的实际重复性工作委托给负责任的班级,同时给予他们更准确的控制(例如,一些实体在被击中一次后可以免受火焰伤害5秒,或者玩家可以穿着防火免疫装甲等)
我希望我能说得好。这两个不同的概念是否有名称,或者它们是否也是“边缘”的概念。得到一个?
上面提到的第三个概念是强行检查损坏处理方法中的对象(例如,用Java中的instanceof
)来确定它们的类,从而决定是否应该处理损坏。这当然是一种简单的方法,只会破坏任何动态方面和模块化。但如果某人有这个名字,我当然会接受它。在那之前,我将继续称之为BFSJ Code
的概念,Brute-Force Static Jumble Code
的缩写。
答案 0 :(得分:0)
如果我允许稍微调整一下你的问题,我宁愿在Double Dispatching的指导下考虑这个问题。在damageBy(amount, source)
的所有可能值中,您可以摆脱条件逻辑,而不是检查损坏源是否会损坏对象,或者接收source
消息的对象在所有可能的值Fire
之间切换。通过fireDamage(amount)
发送消息RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]
RewriteCond %{HTTP_HOST} !^www.marinoswood.gr$ [NC]
RewriteRule ^(.*)$ http://www.marinoswood.gr/$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^185\.4\.133\.44
RewriteRule (.*) http://www.marinoswood.gr/$1 [R=301,L]
RewriteCond %{HTTP_USER_AGENT} libwww-perl.*
RewriteRule .* ? [F,L]
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
</IfModule>
代替地方。这样,损坏的来源就不必检查对象是否对它具有免疫力,并且对象将知道在源特定方法中该做什么。