小编w00*_*w00的帖子

打开/关闭原则 - 如何调用新版本?

我正在尝试掌握开放/封闭原则(在我的情况下是PHP,但这并没有真正有所作为).

我理解的方式是一个类永远不会被修改.仅用于修复错误.如果我想在课程中添加新代码,那么我必须创建一个新代码并扩展"旧"类.这是我可以添加新代码的唯一方法.

在某种程度上,我可以看到这种优势.因为基本上你创建了某种版本控制系统,旧代码总是可以工作,但你总是可以尝试使用新类.

但这在实践中如何运作?我的意思是,假设我有以下课程:

class MyObject
{
    public function doSomething()
    {
        echo 'Im doing something';
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我可能在某个地方实例化这个类:

$obj = new MyObject();
Run Code Online (Sandbox Code Playgroud)

但后来我决定在该对象中使用另一种方法是件好事.所以我也可以做其他事情.根据OCP,我无法修改课程.所以我必须创建一个新的,延伸到旧的一个吧?

第一个问题.我怎么称呼新课程?因为它实际上不是一个完整的新对象.喜欢.User对象是User对象.我不能突然给它完全不同的名称,因为它需要另一种方法.无论如何,我创建了新类:

class MyNewObject extends MyObject
{
    public function doSomethingElse()
    {
        echo 'Im doing something else now';
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这也意味着我必须更改我实例化"MyObject"类的代码行,并将其替换为"MyNewObject"类,对吧..?如果在不止一个地方完成,那么我必须搜索我的源代码...(想想控制器类中的方法,它几乎总是使用'​​new'关键字来实例化某些类).

这基本上适用于继承.我必须找到继承旧类的每个类,并且必须用新类替换它.


基本上我的问题是:

你如何命名具有新方法的新类?只是因为我添加了一些新功能,并不意味着我可以给全班一个全新的名字......

如果"旧"类从多个地方实例化(或继承),该怎么办?然后我必须找到所有这些地方......收益在哪里?

php oop open-closed-principle

12
推荐指数
1
解决办法
292
查看次数

使用jQuery Unobtrusive Validation禁用元素验证

通过某种表单生成器,在页面上呈现元素列表,并且它们都具有对它们的验证.当我查看HTML源代码时,我看到如下内容:

<input type="text" id="email" name="email" data-val-required="No valid email address!" data-val="true">
Run Code Online (Sandbox Code Playgroud)

我需要以某种方式动态地启用/禁用此类元素的验证.我尝试启用/禁用该data-val属性,方法是将其设置为false然后再返回true.但它似乎没有回应.验证总是在那里!

任何人都知道如何以动态方式启用/禁用某些字段的验证?

jquery unobtrusive-validation

12
推荐指数
2
解决办法
2万
查看次数

将大型.sql文件导入MySQL

我收到了一个非常大的mysql备份文件.它是~630 MB ......我想有人认为将图像存储在数据库中是一个好主意......无论如何,我需要在MySQL中以某种方式恢复数据.但由于文件大小,我无法完成它.

起初我尝试使用MySQL Workbench.但是当我尝试导入文件时,它给出了以下错误:

无法分配xxxxx字节来读取文件C:\ backup.sql

然后我试图通过命令提示符来做到这一点.我输入以下内容cmd:

C:\> mysql -u user -pPassword database < C:\backups.sql
Run Code Online (Sandbox Code Playgroud)

这最终给了我以下警告:

ERROR 2006(HY000)第68230行:MySQL服务器已经消失

猜猜那也是因为大文件大小?

我对如何恢复数据没有其他想法.这还有可能吗?

mysql database-restore mysql-workbench

12
推荐指数
1
解决办法
2万
查看次数

Unity fps旋转相机

在我的游戏中,我有一个相机,我希望有一个FPS像旋转附加到这台相机.

因此,如果我将光标向左移动,我希望我的凸轮向左旋转.如果我向上移动光标,那么凸轮应该向上看,等等.

我目前有部分工作.我可以向左,向右,向上和向下看.当我向下看,然后左右移动光标时,会出现问题.然后它给我一个"滚动"效果.

观看此视频,看看我的意思:http: //www.screencast.com/t/Phedh8H0K13

显然,当我向下看时,我仍然想要一个"偏航"效果而不是"滚动"效果.任何人都知道如何做到这一点?这是我到目前为止:

// Update is called once per frame
public override void update ()
{
    this.camera.transform.rotation *= 
        Quaternion.AngleAxis( Time.deltaTime * sensitivityRoll * Input.GetAxis("Vertical"), Vector3.forward );

    this.camera.transform.rotation *= 
        Quaternion.AngleAxis( Time.deltaTime * sensitivityYaw * Input.GetAxis("Mouse X"), Vector3.up );

    this.camera.transform.rotation *= 
        Quaternion.AngleAxis( Time.deltaTime * sensitivityPitch * Input.GetAxis("Mouse Y"), Vector3.left );
}
Run Code Online (Sandbox Code Playgroud)

unity-game-engine

11
推荐指数
1
解决办法
6万
查看次数

在匿名函数中使用变量,该函数在其他地方定义

在PHP中使用匿名函数时,可以使用use()关键字轻松地使用其范围之外的变量.

在我的例子中,匿名函数已经在某处定义,但稍后在(在其他地方)类中调用.

以下代码是为了说明这个想法:

<?php

$bla = function ( $var1 ) use ($arg)
        {
            echo $var1;
        };

class MyClass
{
    private $func;

    public function __construct ( $func )
    {
        $this->func = $func;
    }

    public function test ( $arg )
    {
        $closure =  $this->func;
        $closure ( 'anon func' );
    }
}

$c = new MyClass($bla);
$c->test ( 'anon func' );
Run Code Online (Sandbox Code Playgroud)

我正在做的是我创建一个anonymous function并存储在变量中.我将该变量传递给类的方法,这是我想要运行匿名函数的地方.

但我不能使用use()关键字$argmethod这种方式获取参数.因为匿名函数是在...之外声明的method.

但我真的需要一种方法来从运行匿名函数的方法中获取变量.当匿名函数在其他地方声明时,有没有办法做到这一点?

php closures anonymous-function

11
推荐指数
1
解决办法
9161
查看次数

在MVC中设置存储库模式

我试图弄清楚Repository模式如何工作以及如何在自定义MVC模式中实现它.

据我所知,Repository是一个简单地从实体类返回数据或将实体类保存到持久层的层.

现在我现在看到它是这样的:

请求进入我的控制器以创建用户.只是一个用户名和密码.我的控制器将执行以下操作:

function CreateAction ( )
{
    $userRepo = new userRepository ( );
    $user = new userEntity ( );

    $user->setUsername('user');
    $user->setPassword('123456');

    $userRepo->create($user);
}
Run Code Online (Sandbox Code Playgroud)

然后我的userRepository类看起来像这样:

class userRepository
{
    public function create ( User $user )
    {
        $this->db->exec ( "INSERT INTO ... QUERY TO SAVE THE USER" );
    }
}
Run Code Online (Sandbox Code Playgroud)

我的userEntity类看起来像这样:

class userEntity
{
    private $username;
    private $password;

    public function setUsername ( $username )
    {
        $this->username = $username;
    }

    public function getUsername ( )
    {
        return …
Run Code Online (Sandbox Code Playgroud)

php oop design-patterns ddd-repositories repository-pattern

10
推荐指数
1
解决办法
4183
查看次数

如何扩展多个实用程序类

这个问题有点针对PHP,但它可能也适用于其他语言.在PHP中,您只能扩展一个类.但是如果你需要更多课程呢?

假设我有以下课程:

class MyClass extends Observer, Logger, OtherUtilClass
Run Code Online (Sandbox Code Playgroud)

MyClass不能扩展多个类.但它需要成为观察者.它可能需要一些其他基类以及完全功能.对此最好的方法是什么?

php oop

10
推荐指数
2
解决办法
3万
查看次数

将转换器编写到实际映射发生的位置

我想了解一个转换器是如何工作的.最好这样做是写一个课程.

从理论上讲,我一直在研究一些资源,以了解其工作原理.我理解以下内容:

从我的理解,我基本上需要写两个类:

  1. 词法分析器
  2. 解析器

词法分析器

Lexical Analyzer文件的源代码作为输入(输入流).例如,以下代码:

if (someVar == 20) {
    MessageBox("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)

然后Lexical Analyzer从中创建数据块:

[if]
[ ]
[(]
[someVar]
[ ]
[==]
[ ]
[20]
[)]
[ ]
[{]
[\n]
[\t]
[MessageBox]
[(]
["]
[Hello World!]
["]
[)]
[;]
[\n]
[\t]
[}]
Run Code Online (Sandbox Code Playgroud)

然后将其发送给Parser班级.

解析器

然后,Parser类将读取所有标记块(?)并指定每个标记(?)的含义.它将为其指定某种类型.因此,上述字符串的结果将被标识为:

[if]      // Keyword
[ ]       // Whitespace
[(]       // L_Parenthesis
[someVar] // Identifier
[ ]       // Whitespace
[==]      // Operator
[ ]       // …
Run Code Online (Sandbox Code Playgroud)

compiler-construction lexical-analysis code-translation

9
推荐指数
1
解决办法
2345
查看次数

jQuery Chosen div落后于Twitter Bootstrap手风琴

我在Twitter Bootstrap手风琴中使用了jQuery Chosen插件.我遇到的问题是Chosen插件的下拉菜单出现div在手风琴菜单的"下面" .我试图将其设置z-index为更高的值,但这并没有成功.

我举了一个问题的例子:http://jsfiddle.net/8BAZY/1/

如果您单击该select框,您将看到菜单显示在div.如何将下拉列表显示在手风琴div的顶部,以便我可以看到所有结果?

html css jquery twitter-bootstrap jquery-chosen

9
推荐指数
4
解决办法
9540
查看次数

在更改事件中获取选定的选项值

我有一个dropdown具有以下属性:

<select value.bind="row.columns[$parent.$index].colSize" change.delegate="changeColumnSize($parent.$index, $index, row.columns[$parent.$index].colSize)">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
</select>
Run Code Online (Sandbox Code Playgroud)

但似乎我不能row.columns[$parent.$index].colSize作为参数传递.它始终是undefined.

如何将下拉列表的选定值直接传递给changeevents方法?

aurelia aurelia-binding

9
推荐指数
1
解决办法
6527
查看次数