小编pau*_*l23的帖子

编程范式; 想知道是否需要重写/重构

很长一段时间我一直在研究应用程序.由于编程只是一个爱好,这个项目已经花了太长时间,但除此之外.我现在处于一个每个"问题"变得非常难以解决的地步.我正在考虑重构代码,但这会导致"完全"重写.

让我解释一下这个问题,以及我目前如何解决它.基本上我有数据,我让事情发生在这些数据上(我描述的每个程序都不是我吗?).会发生什么:

数据 - >要求查看器显示 - >查看器显示基于实际数据查看器的数据返回用户输入 - >数据 - >要求"执行程序"执行它 - >新数据

在此输入图像描述

现在这曾经很好地工作,我原本以为"嘿,我可以通过qt或Windows更改命令提示符 - 或者甚至采用外部(C#)并简单地调用此程序".

然而随着计划的发展,它变得越来越无聊.最重要的是,数据以不同的方式显示,具体取决于数据是什么,更重要的是 - 它位于何处.所以我回到了树上并添加了一些"跟踪"父线是什么".然后普通观众将搜索最具体的实际小部件.它使用了一个带有[location; widget]值的列表,并且找到了最匹配的位置.

问题在更新新"数据"时开始 - 我必须经历所有资产 - 查看器,保护程序等等.更新检查机制给了我很多错误.像"嘿,为什么它显示错误的小部件"现在又来了?"

现在我可以完全交换它.而不是调用通用查看器的树数据结构.我会使用OO"内部"树功能.节点将是孩子(当需要新的观察者或保存机制时,形成新的孩子).

这将删除困难的检查机制,我检查树中的位置.然而,它可能会打开另外一堆蠕虫.我想对此发表一些意见吗?我应该让观众完全分开 - 难以检查数据吗?或者新方法更好,但它将数据和执行结合到一个节点中.(所以,如果我想从qt改为cli/C#,那几乎是不可能的)

在此输入图像描述

我到底应该采用什么方法?还有什么我可以做的吗?为了使查看器保持独立,还要防止必须检查以查看应显示哪个小部件?

编辑,只是为了显示一些"代码"以及我的程序如何工作.不知道这是否有任何好处,正如我所说,它已成为一种非常集中的方法论.

它意味着将几个"游戏制作者项目"合并在一起(因为GM:工作室奇怪地缺乏这个功能).Gamemaker项目文件只是xml文件的集合.(仅包含指向其他xml文件的链接的主xml文件,以及每个资源的对象,子画面,声音,房间等的xml文件).然而,有一些"怪癖"使得它不可能用诸如boost属性树或qt之类的东西来阅读:1)属性/子节点的顺序在文件的某些部分非常重要.2)白色空间经常被忽略,但在其他方面,保留它是非常重要的.

话虽如此,节点也完全相同也有很多点.就像背景可以拥有的那样<width>200</width>,房间也可以拥有它.然而对于用户而言,他所谈论的宽度非常重要.

无论如何,所以"general viewer"(AskGUIFn)有以下typedef来处理这个问题:

    typedef int (AskGUIFn::*MemberFn)(const GMProject::pTree& tOut, const GMProject::pTree& tIn, int) const;
    typedef std::vector<std::pair<boost::regex, MemberFn> > DisplaySubMap_Ty;
    typedef std::map<RESOURCE_TYPES, std::pair<DisplaySubMap_Ty, MemberFn> > DisplayMap_Ty;
Run Code Online (Sandbox Code Playgroud)

在"GMProject :: pTree"是树节点的情况下,RESOURCE_TYPES是一个常量,用于跟踪我现在处于什么样的资源(精灵,对象等)."memberFn"在这里只是加载小部件的东西.(虽然AskGUIFn当然不是唯一的普通观众,但只有当其他"自动" - 覆盖,跳过,重命名处理程序失败时才会打开这个.)

现在展示如何初始化这些映射(名称空间"MW"中的所有内容都是qt小部件):

AskGUIFn::DisplayMap_Ty AskGUIFn::DisplayFunctionMap_INIT() {
    DisplayMap_Ty t;
        DisplaySubMap_Ty tmp;

        tmp.push_back(std::pair<boost::regex, AskGUIFn::MemberFn> (boost::regex("^instances "), &AskGUIFn::ExecuteFn<MW::RoomInstanceDialog>));
        tmp.push_back(std::pair<boost::regex, AskGUIFn::MemberFn> (boost::regex("^code $"), …
Run Code Online (Sandbox Code Playgroud)

c++ paradigms refactoring

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

std :: function而不是谓词的模板

许多标准库算法都采用谓词函数.但是,这些谓词的类型是用户提供的任意模板参数.为什么C++ 11没有指定这些类型采用特定类型std::function?例如:

template< class InputIt >
InputIt find_if( InputIt first, InputIt last,
             std::function<bool()> p );
Run Code Online (Sandbox Code Playgroud)

是不是使用这个而不是模板作为参数类型不是更干净?

c++ templates stl c++11 std-function

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

如何使用nodejs发送udp包?

好吧,我有一个小路由,应该发送一个 UDP 包并打印一个确认。根据节点上的文档,以下内容应该可以正常工作:

const dgram = require('dgram');

export async function sendUDP(sess, parameters: {}, res) {
    const client = dgram.createSocket('udp4');
    client.send('Hello World!',0, 12, 12000, '127.0.0.1', function(err, bytes) {
        client.close();
    });

    //res is the response object from express
    return res.send("Send udp packet");
}
Run Code Online (Sandbox Code Playgroud)

它应该向回调 IP(本地机器)上的端口 12000 发送 UDP 请求。并发送UDP数据包已发送的回复。

Send udp packet当我发布到正确的 URL 时,我注意到邮递员收到的回复。所以这是有效的。

但是,UDP 包似乎丢失了,tcpdump在我的本地 ubuntu 上使用会导致虚无:

sudo tcpdump -n udp port 12000

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp5s0, …
Run Code Online (Sandbox Code Playgroud)

javascript ubuntu udp node.js

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

"导入"意外令牌?(铬62)

在尝试解决为什么systemjs找不到我安装的自定义库时(可能是一个后续问题),我在尝试"手动"做事时陷入困境.

所以我有一个简单的系统,包含3个文件:

  • 的index.html
  • hi.js
  • hi2.js

索引只是:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Test</title>
</head>

<body>
<script src="hi.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

hi.js:

import * as hi from "hi2.js";

hi.myFunction();
Run Code Online (Sandbox Code Playgroud)

hi2.js:

function myFunction() {
  alert('hi')
}
export { myFunction };
Run Code Online (Sandbox Code Playgroud)

现在当我在代码上面运行(使用webstorm和chrome 62)时,我得到以下错误,由(chrome)调试器报告:"Uncaught SyntaxError:Unexpected token import"

这里发生了什么事?我检查了mdn上的 javascript兼容性,它告诉我chrome 61和更新版本支持import. - 我用chrome 62来测试它.

那么发生了什么,以及如何使其发挥作用?

每个推荐我也改变了html行<script type="module" src="hi.js"></script>.这根本没有帮助,同样的错误.

javascript google-chrome

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

数字格式,删除千位分隔符

我希望格式化一个数字,使其具有“前导零”(因此字符串始终是相等的长度)。- 虽然我可以作为备份手动执行此操作,但我希望使用最佳选项。- 由于标准格式语法(如 pythons "{0:4d}".format(number))似乎不可用,下一个最好的方法是使用国际化库?

我尝试过用小提琴来做这个:https://jsfiddle.net/f4202ne3/1/

let fmt = new Intl.NumberFormat('en-US', 
  {minimumIntegerDigits: 4,
  maximumFractionDigits: 0
});
m = 1;
n = 5001

console.log(m.toString(), fmt.format(m)) //"0001"
console.log(n.toString(), fmt.format(n)) ///"5000"
Run Code Online (Sandbox Code Playgroud)

然而,这显示“5,000”和“0,001”。如何将千位分隔符设置为值 ( '')?

javascript internationalization number-formatting

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

分配操作员是否"需要"返回?

根据C++标准,我可以确定内置变量的赋值运算符返回(原始值)吗?

或者这个实现是依赖的(但是只是让最流行的编译器实现了这个)?

c++ standards

8
推荐指数
2
解决办法
491
查看次数

Pythonic方式管理任意数量的变量,用于方程求解.

没有直接的例子,这有点难以解释.因此,让我们以非常简单的理想气体定律为例.对于正常情况下的理想气体,下列等式成立:

PV = RT
Run Code Online (Sandbox Code Playgroud)

这意味着如果我们知道4个变量中的3个(压力,体积,特定气体常数和温度),我们可以解决另一个变量.

我怎么把它放在一个物体里?我想有一个对象,我可以插入3个变量,然后计算第4个.我想知道这是否可以通过属性来实现?

我目前最好的猜测就是插入它:

class gasProperties(object):
    __init__(self, P=None, V=None, R=None, T=None)
        self.setFlowParams(P, V, R, T)
    def setFlowParams(self, P=None, V=None, R=None, T=None)
        if P is None:
            self._P = R*T/V
            self._V = V
            self._R = R
            self._T = T
        elif V is None:
            self._V = R*T/P
            self._P = P
            self._R = R
            self._T = T
        #etc
Run Code Online (Sandbox Code Playgroud)

虽然这很麻烦,而且容易出错(我必须添加检查以确定其中一个参数设置为"None").

有更好,更清洁的方式吗?

我看到这种"问题"经常以各种各样的方式发生,特别是一旦变量数量增加(增加密度,雷诺数,混合粘度),不同if语句的数量就会快速增长.(IE如果我有8个变量,任何5个使系统唯一,我需要8 nCr 5 = 56 if语句).

python equation-solving

8
推荐指数
1
解决办法
1015
查看次数

npm 更新:从 github 存储库中拉取,未进行最新提交

项目中的包之一基于内部 npm 存储库。

{
  "dependencies": {
    "my-library": "git+ssh://<gitrepo>#dist"
  }
}
Run Code Online (Sandbox Code Playgroud)

其中 dist 是要克隆的分支。这“有效”,因为它安装了正确的版本。但是,每当此分支发生更新时,我都无法使用 npm 进行更新?- 我尝试过npm update My-Library,但这只是下载旧的提交,它不会转移到同一分支中的较新的提交。

我发现的唯一“解决方案”是手动从 node_modules 文件夹中删除库,并删除其中的库条目package-lock.json(或将其中的引用更新为正确的提交)。

让库遵循另一个 git 存储库的最新版本的正确方法是什么?

编辑:如果这只是一个明确的“不支持”,那对我来说也足够了。

git node.js npm

7
推荐指数
2
解决办法
3950
查看次数

内存管理&std :: allocator

在查看我的代码时,我看到我使用的一些"丑陋"结构,在一个类(称为"map")中我有一个包含"data"类的向量:

std::vector<PointerToHUGEClass> vector;
Run Code Online (Sandbox Code Playgroud)

其中PointerToHUGEClass就像名称所描述的那样.(尽管指向的对象也由map类拥有,并且在构造函数中使用"new"参数创建).这一切都很好(目前).但是我仍然觉得这更像是一种解决方法.

我使用"PointerToHUGEClass"而不仅仅是"HUGEClass" 的唯一原因是因为我想确保不从堆栈声明对象.然而,在我理解分配器之前,这是做的.现在我觉得分配器的任务或多或少是为了确保不从堆栈声明内存.

我的问题:

  • 假设分配器负责物品的内存管理,我是否正确?(并确保从堆栈/ freestore/heap /中声明它)
  • std :: allocator做什么? - 它是从堆栈还是从堆声明的?
  • (从上一个问题开始跟进):如果我将堆栈中声明的项目复制到数据结构中,它是否仍在堆中声明?

再次感谢,paul23

c++ memory-management stl

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

python类型提示,返回与输入相同的类型

好吧,我正在考虑一个有几个孩子的基类的情况。我有一个函数,该函数接受基类对象的列表,并返回包含这些对象的新列表。

现在,如果我显然要使用子类,则返回的是这些子类对象的列表:考虑以下简单情况:

from typing import Sequence, List, TypeVar


class BaseClass:
    def __init__(self, data=None, *args, **kwargs):
        super().__init__()
        self.CanCalculate = True
        if data is None:
            data = []
            self.CanCalculate = False
        self._mydata = list(data)
        self.multiplier = 1

    @property
    def data(self):
        return self._mydata


class ChildClass(BaseClass):
    def sum_mul_data(self):
        return self.multiplier * sum(self.data)


class SecondChildClass(BaseClass):
    def sum_div_data(self):
        return sum(self.data) / self.multiplier


def myFun(input: Sequence[BaseClass]) -> List[BaseClass]:
    out = []
    for n, i in enumerate(input):
        if i.CanCalculate:
            i.multiplier = 10**n
            out.append(i)
    return out


childs = [ChildClass([1,2,3,4]), …
Run Code Online (Sandbox Code Playgroud)

python type-hinting pycharm

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