相关疑难解决方法(0)

什么时候我们应该让构造函数私有&为什么?PHP

可能重复:
在PHP5类中,何时调用私有构造函数?

我最近一直在阅读有关OOP的内容并遇到了这个私有构造函数的情况.我做了Google搜索,但找不到与PHP相关的任何内容.

在PHP中

  • 我们何时必须定义私有构造函数?
  • 使用私有构造函数的目的是什么?
  • 使用私有构造函数的优点和缺点是什么?

php oop constructor

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


C#private,static和readonly

我正在审查log4net的一些代码,我遇到了这个.

private static readonly ILog logger = LogManager.GetLogger(typeof(AdminClient));
Run Code Online (Sandbox Code Playgroud)

我想知道为什么你需要私有静态只读.

从我的理解私有意味着变量不能在类外使用,除非有一个访问器方法或获取属性.

static意味着变量仅在此文件中作用域.

readonly意味着您只能从值中读取并且无法分配它.

所以,我在想那个编写这段代码的人.声明它是私有的,因为他们不希望它在类外使用和静态,因此不希望它在文件外部使用.但是,如果有一个get属性会静态阻止这种形式发生.

我想我只能理解readonly,而且只能读取和设置值.

非常感谢任何建议,

c# log4net access-modifiers

24
推荐指数
3
解决办法
9612
查看次数

我应该如何重构我的代码以删除不必要的单身?

当我第一次看到反单身评论时,我很困惑.我在最近的一些项目中使用了单例模式,并且它运行得很漂亮.事实上,我已经使用了很多次.

现在,在遇到一些问题之后,阅读这个问题,尤其是这篇博文,我理解了我带给世界的邪恶.

那么:我如何从现有代码中删除单例?

例如:
在零售店管理程序中,我使用了MVC模式.我的Model对象描述了商店,用户界面是View,我有一组控制器,它们充当两者之间的联络.大.除了我将Store变成一个单独的(因为应用程序一次只管理一个商店),我还把我的大部分Controller类变成了单例(一个mainWindow,一个menuBar,一个productEditor ......).现在,我的大多数Controller类都可以像这样访问其他单例:

Store managedStore = Store::getInstance();
managedStore.doSomething();
managedStore.doSomethingElse();
//etc.
Run Code Online (Sandbox Code Playgroud)

我应该改为:

  1. 创建每个对象的一个​​实例,并将引用传递给需要访问它们的每个对象?
  2. 使用全局?
  3. 别的什么?

Globals仍然很糟糕,但至少他们不会假装.

我看到#1迅速导致可怕的膨胀构造函数调用:

someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
Run Code Online (Sandbox Code Playgroud)

还有其他人经历过这个吗?如果不是全局变量或单个变量,那么为多个单独的类访问公共变量的OO方法是什么?

language-agnostic singleton refactoring

20
推荐指数
1
解决办法
5635
查看次数

单身模式

我们什么时候应该使用Singleton模式?为什么?

singleton design-patterns

19
推荐指数
4
解决办法
7468
查看次数

设计模式:如何仅在需要时创建数据库对象/连接?

我有一个简单的应用程序,说它有一些类和一个处理数据库请求的"额外".目前我每次使用应用程序时都会创建数据库对象,但在某些情况下,不需要数据库连接.我这样做(PHP顺便说一句):

$db = new Database();    
$foo = new Foo($db); // passing the db
Run Code Online (Sandbox Code Playgroud)

但有时该$foo对象不需要db访问,因为只调用没有数据库操作的方法.所以我的问题是:处理这种情况的专业方法是什么/如何仅在需要时创建数据库连接/对象?

我的目标是避免不必要的数据库连接.

php oop design-patterns database-connection

19
推荐指数
1
解决办法
9844
查看次数

正确实施全局配置

我的目标是在我正在进行的C++游戏中使用全局常量(表示一些图形信息等).我目前的实现是将它们全部放在.h中并将它们包含在各处.这是有效的,除了每次更改设置时,必须重新编译整个代码库.

所以,我的下一个想法是将它们放在一些配置txt文件中并解析它们,这样在设置更改时实际上没有代码被更改.解析器很简单,我可以将值放入常量中,但由于解析器是一个代码块,因此常量不再是全局的.

有没有好办法解决这个问题?也许有些方法可以让它们成为全局,尽管它们处于阻塞或某种方式以避免在更改设置时重新编译所有内容?

c++ constants global-variables configuration-files

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

Singleton - 为什么要使用类?

就在前几天,我看到了使用所谓的单例模式的代码.意思是某些东西

class MySingleton{
public:
    void foo() { ... }
    static MySingleton&get_instance(){
        static MySingleton singleton;
        return singleton
    }
private:
    MySingleton(){ ... }
    ~MySingleton(){ ... }
    int bar;
};
Run Code Online (Sandbox Code Playgroud)

我确实想知道为什么会这样做:

  • 使实例可全局访问.
  • 确保该类的实例永远不会超过一个.

但是,我不明白为什么这种做事方式优于一些免费功能.我实施它的方式是放

namespace some_name{
    void foo();
}
Run Code Online (Sandbox Code Playgroud)

在标题和

namespace some_name{
    void foo(){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在实现文件中.如果我需要初始化和/或清理,我要么添加一些必须显式调用或添加的函数

namespace{
    class Dummy{
        Dummy(){ ... }
        ~Dummy(){ ... }
    }dummy;
}
Run Code Online (Sandbox Code Playgroud)

进入实施文件.

我知道这是从语义的角度来看单例,但是我看到第一个变体在C++代码中使用得比第二个更常见.为什么?我认为第二个版本略胜一筹,所以我问自己是否遗漏了一些明显的东西.

  • 第二个版本实现起来更简单,更不容易出错.在第一个变体中,私有拷贝构造函数是为了证明这一点而缺少的.在第二个变体中,没有办法做这个错误.
  • 在第二个版本中,实现和接口更好地分开.在第一个中,必须在标题中声明所有私有成员.这样做的好处是,您可以从头开始重写实现,甚至不需要重新编译使用单例的任何内容.使用第一个变体时,即使只更改了轻微的实现细节,也很可能需要重新编译所有用户代码.
  • 两种情况都隐藏了实现细节.在使用私有的第一个变体中,在第二个变体中使用未命名的命名空间.

你能解释一下为什么每个人都使用第一个变种吗?我没有看到在C语言中做旧事情的单一优势.

c++ singleton

16
推荐指数
2
解决办法
3738
查看次数

静态成员函数

在阅读sbi和Eli Bendersky在这个问题中的答案后,我开始想知道静态成员函数的用途.

一个类的朋友免费功能应该不能做任何静态成员函数可以做的事情?如果是这样,为什么/何时我应该更喜欢静态成员函数给朋友免费?

c++ static function static-members non-member-functions

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

PHP构造函数和静态函数

关于构造函数在PHP中如何工作,我有点困惑.

我有一个带有构造函数的类,当我实例化一个新对象时会调用它.

$foo = new Foo($args);
Run Code Online (Sandbox Code Playgroud)

__construct($params)在类中调用Foo它并执行适当的初始化代码.

但是,当我使用该类调用静态函数时,将再次调用构造函数.

$bar = Foo::some_function(); //runs the constructor from Foo
Run Code Online (Sandbox Code Playgroud)

这会导致构造函数执行,运行我打算仅在创建新Foo对象时使用的对象初始化代码.

我是否忽略了构造函数的工作原理?或者有什么方法可以防止__construct()在我使用类进行静态函数调用时执行?

我应该使用"工厂"功能来进行对象初始化吗?如果是这样,构造函数的重点是什么呢?

::编辑::我有一个表单,用户可以将照片上传到相册(create_photo.php)和他们可以查看相册的区域(view_photos.php).提交表格时:

$photo = new Photo($_FILES['photo'], $_POST['arg1'], ect..);
Run Code Online (Sandbox Code Playgroud)

Photo构造函数创建并保存照片.但是在view_photo.php中,当我打电话时:

$photo = Photo::find_by_id($_POST['id']) //user-defined function to query database
Run Code Online (Sandbox Code Playgroud)

这导致Photo的构造函数运行!

php constructor static-functions

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