Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coding style 如何在向用户报告进度时生成最干净的代码?_Coding Style_Progress Bar - Fatal编程技术网

Coding style 如何在向用户报告进度时生成最干净的代码?

Coding style 如何在向用户报告进度时生成最干净的代码?,coding-style,progress-bar,Coding Style,Progress Bar,在过去的几个月里,我一直在努力想出一些干净的代码来向用户报告进度。一切似乎都归结为: ReportProgress("Starting Task 1"); doTask1(); ReportProgress("Task 1 is done"); ReportProgress("Starting Task 2"); doTask2(); ReportProgress("Task 2 is done"); //etc... where report progress does some form

在过去的几个月里,我一直在努力想出一些干净的代码来向用户报告进度。一切似乎都归结为:

ReportProgress("Starting Task 1");
doTask1();
ReportProgress("Task 1 is done");

ReportProgress("Starting Task 2");
doTask2();
ReportProgress("Task 2 is done");

//etc... where report progress does some form of output to the user.
我身上优秀的编码员尖叫着“一定有更干净的方法!”但我被难住了。有什么想法吗

编辑::我正在寻找更多关于体系结构信息的信息,而不是特定于实现的信息。给出的代码过于简单。

您是否可以使用并设计一个进度方面


有许多AOP实现。在Java世界中,最常见的两种是AspectJ和Spring(它使用AspectJ或基于代理的方面)。

在doTask()调用中有报告是很自然的。

通常,reporter是所有对象发送消息的单一对象,reporter类负责决定是否显示它以及在何处显示它—statusbar、log file、stderr等。

假设您正在执行的模式是:

  • 日志任务启动
  • 做任务
  • 日志任务结束
您可以有一个“Task”类(所有任务的父类),其do()方法是子类化的,并自动记录任务的开始和结束


这只是一个想法。

您可以从doTask方法内部调用ReportProgress,这可能会使它看起来更干净,而您只需要:

doTask1();
doTask2();
报告将在这些方法内处理


你可以用AOP,但我的大脑尖叫着亲吻!!(保持简单愚蠢)在这种情况下。如果这只是您正在处理的更复杂事物的简单表示,那么AOP可以是一个选项。

您可以创建一个带有名称属性和委托的任务类。将每个任务放在一个集合中,然后对其进行迭代,打印消息并为每个任务调用委托。

我不会对显示消息的数字部分进行那样的手工编码(任何时候需要添加或删除操作或更改顺序时,都需要进行大量的剪切和粘贴操作)。您希望处理ReportProgress方法的任何对象在执行过程中自动递增自身。

将任务设置为事件流,并使用事件处理“引擎”报告进度。每个事件实例都可以有自己的名称、进度报告简介/模板等

如果这是一种经常发生的模式,那么为基础架构付出的努力是值得的。完成后,可用的代码可能如下所示:

EventQueue tasks = new EventQueue();
tasks.Add(new TaskEvent(this.doTask1,"Foo-ing the bar"));
tasks.Add(new TaskEvent(this.doTask2,"Bar-ing the foo"));
tasks.Add(new TaskEvent(this.doTask3,"Glitching and whinging"));
...
tasks.Execute(this.ProgressEventHandler);

一个相当简单和干净的方法是创建一个抽象类,该类有一个
do()
方法和抽象doTask()和getName()方法:

然后在您的任务中:

class Task1 extends Task {
    getName(){return "Task 1";}
    doTask() {
        //do stuff here
    }
}

然后,您可以拥有一个任务,该任务具有一个doTask()方法,该方法在一大堆其他任务上运行
do()
。这很容易是递归的,因为任何任务都可能运行许多子任务。

+1关于AOP建议。这是一个经典的横切问题,AOP可以优雅地解决。

不幸的是,我认为最好的解决方法确实取决于细节——至少取决于您使用的语言。例如,在python中,您可以使用a来编写如下代码:

with progress_report("Task 1"):
    do_task_1()

例如,这可以确保即使do_Task_1()引发异常,也会报告“Task 1已完成”。如果您愿意,您可以单独处理异常并打印不同的内容,如“任务1失败”或“任务1中止”。

在我们的工具包中,我们有一个任务控制器来管理任务。任务作为线程运行。除了典型的线程支持外,任务还支持进度方法。进度的一个可能视图是一个可视化进度条,其标题表示任务名称和任务中的步骤。为了支持可见的统计信息和状态,代码必须偶尔调用任务的进度方法。通常,这是在for循环中完成的,因为进度百分比可以通过当前索引除以限制来估计


任务控制器是添加全局线程控制、状态探测、其他统计信息和性能度量挂钩的有用地方。通过检查控制器的状态和所有任务的状态,可以分析一些多线程错误和计时问题。

这取决于动态需要多少配置,我希望代码非常通用,并通过spring或任何ioc容器设置任务

这些都将在spring配置中: xml配置将为任务对象提供其名称和参数。 然后将这些任务添加到集合中,并将该集合交给taskrunner

然后,任务运行程序是一种代码,用于指示每个任务的停止和开始,但每个任务都可以自由地给出其运行方式的特定状态。此外,taskrunner将捕获任何异常,并在出现错误时继续运行。它可以配置为说,某些任务依赖于其他任务的完成,而某些任务如果失败,则应该停止一切


我不同意这里应该使用AOP。过度杀伤力。

如果您使用的是.NET,我建议使用中的策略注入应用程序块(最低版本:3.1)。我使用了类似的方法为一个非常注重模仿的网站“还原到应用程序池身份”

你可以对你的任务做同样的事情。您可以简单地定义一个带有工厂的任务类,该工厂使用企业库对象工厂构建对象,并自动向任务添加“Before”和“After”消息。这会给你所需要的电能带来你想要的东西


玩得开心

这将方法耦合到reporter类,这意味着您不能在不报告的情况下调用该方法(或者添加一个参数来控制是否调用reporter)。那可能没关系,只是说。你通常让报告者对象决定它是否要报告。除非您担心报告不使用的消息的开销
with progress_report("Task 1"):
    do_task_1()