标签: software-design

Java:使用一个类生成另一个类的对象

我有两节课.SpeciesReader获取文件并解析它们.Species存储有关物种的某些数据,这些数据已从文件中解析.

目前,我有一个方法:SpeciesReader.generateSpecies(),它使用实例化它的文件来创建一个Species对象.这是不好的做法/设计吗?我应该以某种方式找到一种方法将其移动到构造函数中Species,将文件名作为参数?

java oop constructor factory software-design

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

如何创建可插件的应用程序?

我创建了一些程序,但大多数都是基于“意大利面条”方法。所有功能都在一起,如果我想添加新功能,我必须将其添加到核心文件中。

注意:我不是在问分离设计和逻辑。

语言是PHP。

我要问的是内容管理系统中通过允许其他用户扩展应用程序(插件、组件或扩展)来使用哪些方法(以及如何实现它们)

这只是设计模式的问题吗?或者文件结构?或者是什么?

php software-design application-design

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

为什么只在一个类中使用Java接口?

我最近正在阅读某人的代码,他们创建了一个仅由一个类实现的界面.在我看来,接口是不必要的.创建仅由一个类实现的接口有哪些设计原因?

java interface software-design

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

修改并返回传递的参数

我的代码具有类似修改并返回传递的对象参数的方法。

在我看来,这就像一种糟糕的代码味道。

public class Creator {
  public MyClass create(MyClass param) {

    SomeClass attr1 = createAttr1();
    SomeClass attr2 = createAttr2();
    //... more creation

    param.setAttr1(attr1);
    param.setAttr2(attr2);
    //... set other created attributes.

    return param;
  }
}


public class MyApp {
  public static void main(String[] args) {
    Creator creatorProcesss = new Creator();
    MyClass myClass = new MyClass();
    myClass = creatorProcesss.create(myClass);
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有适当的方法来重构它?

java refactoring software-design

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

在领域驱动设计中将业务规则与实体分离

当我在软件项目中实践 DDD 时,我总是面临这样的问题:“为什么我应该在实体中实现我的业务规则?它们不应该是纯数据模型吗?”

请注意,根据我对 DDD 的理解,领域模型可以由持久模型和值对象组成。

我提出了一个解决方案,将持久模型与域模型分开。另一方面,我们有数据传输对象 (DTO),因此我们有 3 层数据映射。数据库到持久性模型、持久性模型到域模型以及域模型到 DTO。在我看来,我的解决方案不是一个有效的方案,因为必须付出太多的努力。

那么有没有更好的做法来实现这个目标呢?

domain-driven-design software-design

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

如果在用户计算机上签出,则监控代码回购

不确定这是否是发布此问题的地方,但我想知道是否有人知道任何允许您跟踪您的GIT仓库代码库的应用程序,如果已在其他用户计算机上签出.当我的意思是跟踪时,我的意思是阻止他们将软件从他们的机器复制到其他任何地方等......从我作为软件工程师工作的经验来看,我刚刚从公司交了一台笔记本电脑,但任何人都可以轻松地拿走他们的工作并创造了它的副本.

公司IP确实保护了他们的代码/数据库,但是再一次,很难跟踪你的后端代码库是否已被其他人复制.

如果已经回答这个问题,我会事先道歉但是到目前为止我无法在StackOverflow或网络上找到它.

git testing tracking software-design codebase

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

多态与动态铸造

所以我正在研究一个基于文本的RPG,我遇到了一个问题.我目前正在从角色的库存中装备武器.我试图这样做,以便我的程序可以判断他们想要装备的物品是否属于等级Weapon.这是相关代码的剪辑:

 Item tempChosenWeapon = myInventory.chooseItem();
cout << tempChosenWeapon.getName() << endl;
Item *chosenWeapon = &tempChosenWeapon;
cout << chosenWeapon->getName() << endl;//THE CODE WORKS UP TO HERE

Weapon *maybeWeapon = dynamic_cast<Weapon*>(chosenWeapon);
cout << maybeWeapon->getName() << endl;
Run Code Online (Sandbox Code Playgroud)

现在,Weapon是一个子类Item,这就是为什么我使用动态强制转换 - 尝试更改chosenWeapon(类型)Item,Weapon以便比较两个类.(我正在使用这些cout<<或测试是否从这些对象调用函数).

我的程序编译,一切运行正常,直到我们来到maybeWeapon->getName()程序崩溃.我已经研究了很多,但我只是不明白我做错了什么.任何答案或替代建议非常感谢!谢谢!

c++ polymorphism software-design game-development game-engine

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

将不透明的结构定义放入单独的头文件中

我正在设计一个带有公共接口的库,其中包含不透明的结构声明:

lib_public.h:

typedef struct lib_struct lib_struct;

void foo(lib_struct *ptr);

void bar(lib_struct *ptr);
Run Code Online (Sandbox Code Playgroud)

不透明lib_struct的结构隐藏了特定于操作系统的实现细节,因此直接将其放入其中似乎是一个糟糕的设计lib_struct.h。但我仍然想为它编写使用其成员的单元测试。目前,我决定创建一个单独的私有头文件,仅包含结构定义:

lib_struct_linux.h:

struct lib_struct{
   int epoll;
   int acceptor_socket;
}
Run Code Online (Sandbox Code Playgroud)

因此,实现lib_struct.c和单元测试lib_struct_test.c将包含此标头,如下所示:

lib_struct.c:

#include "lib_struct_linux.h"

//function definition
Run Code Online (Sandbox Code Playgroud)

lib_struct_test.c:

#include "lib_struct_linux.h"

//unit tests
Run Code Online (Sandbox Code Playgroud)

问题是这样的设计看起来很混乱,因为结构体是在一个私有头文件(lib_struct_linux.h)中定义的,而使用该结构体的函数是在另一个公共头文件(lib_public.h)中声明的。函数的定义在另一个实现文件(lib_struct.c)中。

这是常见的方法吗?如果不是,如何才能以更好的方式设计它。

c struct software-design opaque-pointers

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

打破 Liskov 替换原则

我有以下代码

public class A 
{
      public double foo(double y) 
      {
             return real_value;
      }
}
Run Code Online (Sandbox Code Playgroud)

其中foo方法的输入-1 < y < 1和函数的结果是大于零的实数。

然后我有class B继承class A并覆盖方法的继承foo

public class B extends A 
{
      public override double foo(double y)
      {
         return real_value;
      }
}
Run Code Online (Sandbox Code Playgroud)

其中foo方法的输入0 < y < 1和函数的结果是任何实数。

这里是否违反了 Liskov 替换原则?

提前致谢。

liskov-substitution-principle software-design solid-principles

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

在构造函数上传递参数或在每个方法上传递参数

我正在学习C ++,并且具有以下头文件:

#ifndef _ROBOT_MOVE_H__
#define _ROBOT_MOVE_H__ 1

#include "ros/ros.h"

class RobotMove
{
private:
    double current_linear;
    double current_angular;
public:
    void TurnLeft(const ros::Publisher& publisher, ros::Rate& loop_rate);
    void TurnRight(const ros::Publisher& publisher, ros::Rate& loop_rate);
    void TurnAround(const ros::Publisher& publisher, ros::Rate& loop_rate);
    void Forward(const ros::Publisher& publisher, ros::Rate& loop_rate);
    void Backward(const ros::Publisher& publisher, ros::Rate& loop_rate);
    void Stop();

    RobotMove();
    ~RobotMove();
}


#endif
Run Code Online (Sandbox Code Playgroud)

我不知道const ros::Publisher& publisher, ros::Rate& loop_rate在构造函数上传递一次还是每次我调用其他方法时传递它们是否更好。

最好在构造函数中传递这两个参数,并将指针存储在类中,或者在每个方法上传递它们?

顺便说一句,这两个参数将始终是相同的对象。

c++ design-patterns software-design

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