很长一段时间我一直在研究应用程序.由于编程只是一个爱好,这个项目已经花了太长时间,但除此之外.我现在处于一个每个"问题"变得非常难以解决的地步.我正在考虑重构代码,但这会导致"完全"重写.
让我解释一下这个问题,以及我目前如何解决它.基本上我有数据,我让事情发生在这些数据上(我描述的每个程序都不是我吗?).会发生什么:
数据 - >要求查看器显示 - >查看器显示基于实际数据查看器的数据返回用户输入 - >数据 - >要求"执行程序"执行它 - >新数据

现在这曾经很好地工作,我原本以为"嘿,我可以通过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++ 11没有指定这些类型采用特定类型std::function?例如:
template< class InputIt >
InputIt find_if( InputIt first, InputIt last,
std::function<bool()> p );
Run Code Online (Sandbox Code Playgroud)
是不是使用这个而不是模板作为参数类型不是更干净?
好吧,我有一个小路由,应该发送一个 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) 在尝试解决为什么systemjs找不到我安装的自定义库时(可能是一个后续问题),我在尝试"手动"做事时陷入困境.
所以我有一个简单的系统,包含3个文件:
索引只是:
<!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>.这根本没有帮助,同样的错误.
我希望格式化一个数字,使其具有“前导零”(因此字符串始终是相等的长度)。- 虽然我可以作为备份手动执行此操作,但我希望使用最佳选项。- 由于标准格式语法(如 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”。如何将千位分隔符设置为值 ( '')?
根据C++标准,我可以确定内置变量的赋值运算符返回(原始值)吗?
或者这个实现是依赖的(但是只是让最流行的编译器实现了这个)?
没有直接的例子,这有点难以解释.因此,让我们以非常简单的理想气体定律为例.对于正常情况下的理想气体,下列等式成立:
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语句).
项目中的包之一基于内部 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 存储库的最新版本的正确方法是什么?
编辑:如果这只是一个明确的“不支持”,那对我来说也足够了。
在查看我的代码时,我看到我使用的一些"丑陋"结构,在一个类(称为"map")中我有一个包含"data"类的向量:
std::vector<PointerToHUGEClass> vector;
Run Code Online (Sandbox Code Playgroud)
其中PointerToHUGEClass就像名称所描述的那样.(尽管指向的对象也由map类拥有,并且在构造函数中使用"new"参数创建).这一切都很好(目前).但是我仍然觉得这更像是一种解决方法.
我使用"PointerToHUGEClass"而不仅仅是"HUGEClass" 的唯一原因是因为我想确保不从堆栈声明对象.然而,在我理解分配器之前,这是做的.现在我觉得分配器的任务或多或少是为了确保不从堆栈声明内存.
我的问题:
再次感谢,paul23
好吧,我正在考虑一个有几个孩子的基类的情况。我有一个函数,该函数接受基类对象的列表,并返回包含这些对象的新列表。
现在,如果我显然要使用子类,则返回的是这些子类对象的列表:考虑以下简单情况:
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) c++ ×4
javascript ×3
node.js ×2
python ×2
stl ×2
c++11 ×1
git ×1
npm ×1
paradigms ×1
pycharm ×1
refactoring ×1
standards ×1
std-function ×1
templates ×1
type-hinting ×1
ubuntu ×1
udp ×1