重构大型"仅状态"对象有哪些常见策略?
我正在研究一个特定的软实时决策支持系统,该系统可以对国家空域进行在线建模/模拟.该软件消耗大量实时数据馈送,并对空域中的大量实体的"状态"进行每分钟一次的估计.这个问题整齐地分解,直到我们达到目前最低级别的实体.
我们的数学模型估计/预测每个这些实体的过去和未来几个小时的时间线的50个参数,大约每分钟一次.目前,这些记录被编码为具有大量字段的单个Java类(一些字段被折叠成一个ArrayList).我们的模型正在不断发展,并且各个领域之间的依赖关系还没有一成不变,因此每个实例都会在一个复杂的模型中漫游,随着它的发展积累设置.
目前我们有类似下面的内容,它使用构建器模式方法来构建记录的内容,并强制执行已知的依赖项(作为程序员错误的检查,演变模式.)一旦估计完成,我们使用.build()类型方法将以下内容转换为不可变形式.
final class OneMinuteEstimate {
enum EstimateState { INFANT, HEADER, INDEPENDENT, ... };
EstimateState state = EstimateState.INFANT;
// "header" stuff
DateTime estimatedAtTime = null;
DateTime stamp = null;
EntityId id = null;
// independent fields
int status1 = -1;
...
// dependent/complex fields...
... goes on for 40+ more fields...
void setHeaderFields(...)
{
if (!EstimateState.INFANT.equals(state)) {
throw new IllegalStateException("Must be in INFANT state to set header");
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
一旦完成了大量这些估算,就会将它们汇总到时间线中,分析汇总的模式/趋势.我们已经考虑过使用嵌入式数据库,但却遇到了性能问题.我们宁愿在数据建模方面对其进行整理,然后将部分软实时代码逐步移动到嵌入式数据存储中.
完成"时间敏感"部分后,产品将刷新为平面文件和数据库.
问题: …
我看到这个术语常用,就好像在讨论面向OO语言的MVC时两者之间有一个具体的区别.从我从上下文中得到的是,商业模型执行一个动作来改变数据模型.这是表达差异的正确方法吗?
我想让我感到困惑的是,大多数模型的例子都混合了这两种角色,表面上看起来很自然.通常,更改对象状态的方法位于这些对象本身内部.我想我无法想出一个如何在现实世界中运作的例子.更改对象的方法在该对象内部似乎更自然.任何人都可以更清楚地解释一下吗?
我正在尝试为SilverStripe站点做一些非常不同的事情:在几个子页面上是数据表,这些表每个都有自己的列标题集,有些表的列比其他表多.我想避免在富文本编辑器中构建表格,因为这容易出现很多错误,并且随着时间的推移维护是一件麻烦事.
我想要做的是创建一个DataObject,它允许第n个列和第n个相应的行.这样我可以在模板中调用一个循环(或可能是两个),我已经有了HTML表结构.内容管理员可以完全控制任何给定子页面的表格中的哪些列,并且他们不必担心维护HTML表格设置.
我有几个想法没有产生我想要的结果,没有a)使内容管理器的UI体验过于复杂,b)无法正确地将列与行链接.
我曾想过为Table Headers创建一个DataObject,为Table Rows创建一个DataObject,但后来我很难理解如何以一种有意义的方式组合它们,特别是因为可能有任意数量的列.
有人会有任何建议来接近这个吗?
更新:好的,我有一些可用的TableRowItem数据对象,并且接近工作.但是,现在的问题是:当我基本上即时创建它们时,如何将字段值保存到数据库?就像现在一样,保存到数据库的唯一字段是PDF文件上载字段,其他所有内容在点击"创建"时都会被删除.
<?php
class TruckBodyPdfTableRowItem extends DataObject {
private static $db = array(
);
// One-to-one relationship with gallery page
private static $has_one = array(
'TablePage'=> 'Page',
'TableColumnSet' => 'TableColumnSet',
'PDF' => 'File',
);
// tidy up the CMS by not showing these fields
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->removeFieldFromTab("Root.Main","TablePageID");
$fields->removeFieldFromTab("Root.Main","TableColumnSetID");
$fields->removeFieldFromTab("Root.Main","SortOrder");
$fields->addFieldsToTab("Root.Main", $this->getMyColumnOptions());
return $fields;
}
public function getMyColumnOptions()
{
$columnArray = [];
$Columns = DataObject::get('TableColumnSet');
foreach($Columns as $Column){
$columnArray[] = …Run Code Online (Sandbox Code Playgroud) 示例:我有会员(可以登录和更新他们的数据),他们有一个或多个资格.所以我有一个DataObject'Members'和一个带有has_one/has_many关系的DataObject'Qualification'.
像这样的东西:
class Qualification extends DataObject {
private static $db = array (
'Title' => 'Text',
'From' => 'Date',
'Till' => 'Date'
);
private static $has_one = array (
'Member' => 'Member',
);
Run Code Online (Sandbox Code Playgroud)
...
class Member extends DataObject {
...
private static $has_many = array (
'Qualifications' => 'Qualification',
);
...
Run Code Online (Sandbox Code Playgroud)
现在我想在前端构建一个表单,允许成员一次添加许多资格,并以相同的形式更新现有资格.
它可能看起来像这样
Qualifikation One
标题:xxx(textfield)来自:xxx(datefield)直到:xxx(datefield)
Qualifikation二
标题:xxx(textfield)来自:xxx(datefield)直到:xxx(datefield)
+添加资格
最好的方法是什么?
我可以使用jQuery动态添加字段,如下所示:http://jsfiddle.net/nzYAW/
但是我如何处理更新并将它们添加到数据库中.我尝试的一切都非常复杂和混乱,所以我想也许其他人有一个我现在看不到的想法.我们将不胜感激!
希望这不是重复的。如果是这样,请在评论中指出我,我将再次删除该问题。
我有一个数据对象,其中的数据仅在捆绑包中有效 - 即,在不使其他成员无效的情况下更改一个成员的值是没有意义的。
该数据对象描述了一些图像信息:
struct ImageInfo
{
ImageInfo(const double &ppix, ...)
: PpiX(ppix),
...
{ }
const double PpiX;
const double PpiY;
const int SizeX;
const int SizeY;
};
Run Code Online (Sandbox Code Playgroud)
在我的图像对象中,我有一个类型的非常量成员ImageInfo:
class MyImageObject
{
...
private:
ImageInfo mMyInfo;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够mMyInfo在运行时进行更改,但前提是它需要一个新的 ImageInfo(...) 实例。
在该MyImageObject::Load()函数中,我想从文件信息中读取此数据,然后ImageInfo使用正确的数据集创建一个实例:
double ppix = ImageFile.GetPpiX();
...
mMyInfo = ImageInfo(ppix, ...);
Run Code Online (Sandbox Code Playgroud)
但我无法编写一个有效的赋值运算符(复制构造函数当然是可能的)。我的解决方案留空mMyInfo,因为我没有引用this:
ImageInfo operator=(const ImageInfo &other)
{
// no reference to *this
return ImageInfo(other);
} …Run Code Online (Sandbox Code Playgroud) 当我DataObject.GetData(typeof(ItemType))从方法的子类的实例调用此方法时ItemType返回null ...如何从子类型获取数据?谢谢
对于某些包,我可以看到特殊类型的对象.例如,当我尝试从包打印数据集时,我收到以下消息.
multitrait
This is an object of class "cross".
It is too complex to print, so we provide just this summary.
RI strains via selfing
No. individuals: 162
......................and other summary information
Run Code Online (Sandbox Code Playgroud)
是(multitrait)
[1] "riself"
Run Code Online (Sandbox Code Playgroud)
我想知道我们如何创造这样的对象.它们是数据帧的特殊列表,向量矩阵.
X <- c("A", "B", "C")
Y <- data.frame (A = 1:10, B = 21:30, C = 31:40)
myeq <- c("Y ~ X1 + Y1")
K <- 100
A = 1:20
B = B= 21:40
J <- as.matrix(A,B )
myl1 <- list(J, K)
Run Code Online (Sandbox Code Playgroud)
现在我的复杂对象:
mycomplexobject …Run Code Online (Sandbox Code Playgroud) data-objects ×7
silverstripe ×2
c# ×1
c++ ×1
class ×1
constants ×1
data-binding ×1
forms ×1
java ×1
jquery ×1
list ×1
oop ×1
package ×1
r ×1
refactoring ×1
wpf ×1