我喜欢组织我的代码,所以理想情况下我想要每个文件一个类,或者当我有非成员函数时,每个文件需要一个函数.
原因是:
当我阅读代码时,我将始终知道在哪个文件中我应该找到某个函数或类.
如果它是每个头文件的一个类或一个非成员函数,那么当我include成为头文件时,我不会包含整个混乱
.
如果我在函数中做了一些小改动,那么只需要重新编译该函数.
但是,将所有内容拆分为许多标头和许多实现文件都会使编译速度变慢.在我的项目中,大多数函数访问一定数量的模板化其他库函数.因此代码将反复编译,每个实现文件一次.编译我的整个项目目前在一台机器上需要45分钟左右.大约有50个目标文件,每个目标文件使用相同的昂贵编译头.
也许,每个头文件有一个类(或非成员函数)是可接受的,但是将许多或所有这些函数的实现放在一个实现文件中,如下例所示?
// foo.h
void foo(int n);
// bar.h
void bar(double d);
// foobar.cpp
#include <vector>
void foo(int n) { std::vector<int> v; ... }
void bar(double d) { std::vector<int> w; ... }
Run Code Online (Sandbox Code Playgroud)
同样,优点是我可以只包含foo函数或只包含bar函数,整个项目的编译速度会更快,因为foobar.cpp是一个文件,所以std::vector<int>(这只是其他一些昂贵的例子)编译模板化构造)必须只编译一次,而不是两次编译a foo.cpp和bar.cpp单独编译.当然,我上面的原因(3)对于这种情况是无效的:刚刚改变foo(){...}之后我必须重新编译整个可能很大的文件foobar.cpp.
我很好奇你的意见是什么!
c++ build-process file-organization compilation code-organization
比如说,我的头文件是:
class A
{
void Complicated();
}
Run Code Online (Sandbox Code Playgroud)
和我的源文件
void A::Complicated()
{
...really long function...
}
Run Code Online (Sandbox Code Playgroud)
我可以将源文件拆分为
void DoInitialStuff(pass necessary vars by ref or value)
{
...
}
void HandleCaseA(pass necessary vars by ref or value)
{
...
}
void HandleCaseB(pass necessary vars by ref or value)
{
...
}
void FinishUp(pass necessary vars by ref or value)
{
...
}
void A::Complicated()
{
...
DoInitialStuff(...);
switch ...
HandleCaseA(...)
HandleCaseB(...)
...
FinishUp(...)
}
Run Code Online (Sandbox Code Playgroud)
完全是为了可读性而不担心性能方面的影响?
因此,假设我想创建一系列类,每个类都具有相同的成员函数.我们来调用这个函数吧
void doYourJob();
Run Code Online (Sandbox Code Playgroud)
我想最终把所有这些类放到同一个容器中,这样我就可以遍历它们并让每个类都执行'doYourJob()'
显而易见的解决方案是使用该函数创建一个抽象类
virtual void doYourJob();
Run Code Online (Sandbox Code Playgroud)
但我这样做犹豫不决.这是一个耗时的计划,虚拟功能可以大大提高它.此外,这个函数是类中唯一相互共同的函数,并且doYourJob对每个类的完全不同.
有没有办法避免使用具有虚函数的抽象类,或者我将不得不吮吸它?
注意:这篇文章代表我的询问问题#1.在两个问题中重复引入块(直到达到数字的所有文本),因为它是回答问题可能需要的背景信息.
我有一个非托管C++库,它包含几个"更高级别"库之间共享和共享的类和函数.我现在需要提供对C#/ .Net应用程序的公共库的访问.为此,我将使用C++/CLI包装类包装公共库.
公共库中包含的类可以是包含嵌套类定义和成员变量的复杂类,这些变量是其他类对象的集合.集合变量是用于管理集合的自定义列表类的typedef的实例.公共库还包括表示使用FLEX/BISON创建的自定义脚本文件语法的已解析结构的类.公共库和"更高级别"库都是以允许跨平台(Linux和GCC)编译和使用的方式编写的.我所做的任何改变都必须允许这样做.
C++/CLI包装器类首先只需要读取功能.但随着项目的进展,我最终还需要能够创建和修改对象.
我了解C++/CLI并为其他非托管C/C++项目创建了几个包装器,并为这个公共库提供了抽象功能.所以我已经掌握了基础知识(以及一些高级知识).
我有两个与执行此任务相关的问题,因为他们可以产生自己的讨论和解决方案,我将我的问题分成不同的帖子.我将在每篇文章中包含指向其他问题的链接.
如何在项目中构建我的文件?
非托管和C++/CLI项目之间的名称空间和类名称不会发生冲突.由于非托管项目使用类名称的"C"前缀而C++/CLI不使用.所以非托管类CWidget将变得公正Widget.他们使用不同的根命名空间名称.
当涉及文件名时会出现问题.作为我的默认命名模式是使用Widget.h与Widget.cpp两个非托管C++/CLI.
目前正在设置项目,项目的所有文件都位于项目文件夹的根目录中.头文件的包含仅作为标题的名称(例如#include "Widget.h").并且为了适当地解析包含不同项目的文件,将另一个项目的路径添加到Additional Include Directories使用项目的属性中.
如果我将我的Additional Include Directories属性更改为解决方案的根(..\)并为非托管标头执行我的包含,那么#include "Unmanaged\Widget.h我有一个新问题,即解析非托管标头中包含的标头.因此,使用该选项需要将所有 include语句更改为其项目目录的前缀.我知道其他项目
重复文件名问题最明显/最快的解决方案是更改其中一个库的命名模式.因此对于C++/CLI项目,而不是使用Widget.h和Widget.cpp前缀或后缀m(托管)或w(包装).所以C++/CLI的文件将是mWidget.h,wWidget.h,WidgetM.h,或WidgetW.h.然后,我可以重复我现有的模式并保持良好状态.
但有没有更好的方法来组织文件,以便我可以保留我的前/后缀较少的文件名,只需对现有代码进行最小的更改?
可能重复:
如何管理CSS爆炸
我找到的最困难的事情之一是保持我的样式表有条理.我通常从编写一个小的重置部分开始.然后我编写布局块,并在编写HTML块时继续逐步添加样式.
但是,在前两步之后,一切都变得一团糟.基于我的异想天开的HTML编码,样式会被添加,删除,遗忘,这经常被更改.我找不到一种合理的方法来分离和分类我的CSS.
我发现自己为默认样式,导航和布局创建了单独的工作表.
在我编写了页脚的CSS后,我无法弄清楚它是否应该进入默认样式表,导航样式或布局文件.它的容器当然是布局的一部分,它的导航菜单是部分导航,但它的样式应该进入基本样式表.我发现自己正在考虑相应地分离CSS,但这不可能是正确的.
我找不到合理的方法将我的想法组织成有序的分类.
有人可以给我任何见解吗?
我正着手开发一个用于可视化的JavaScript Web应用程序,其中包含带注释的各种图形的书签等
.典型的例子是:给定一个url状态,显示两个SVG图形和一个用于操作的时间滑块以及一些信息性注释在这里和那里.
传统上(并且有一段时间没有编写JS),我会尝试某种模块化的JS方法:
src
data
chart
chartType1
chartType2
chartType3
layoutManager
stateManager
utils
lib
d3?
backbone?
jquery?
Run Code Online (Sandbox Code Playgroud)
...打破数据处理,一些实用功能,状态和布局管理器等.
但是由于那里有大量的图书馆,或许我应该抓住我的马并尝试一种新方法?
代码组织?
- 像上面或更多的MVC一样吗?
- 任何有用的特定模式?
(伪代码非常感谢)
国家处理/模型?
- Backbone.js
- JavaScriptMVC
看法?
- 有没有使用SVG库(D3,Raphaël等)和mvc框架的JS vis应用程序的好例子?
编译/ minifier?
- Google Closure编译器
- Jammit
IDE?
- Aptana Studio 3
- Netbeans
- 其他?
桌面版?(标准:数据存储,可更新等)
- AIR
- Chromium Embedded
- XULrunner
- Titanium appcelerator
- 其他选项?
对不起,这个问题的范围相当广泛,但如果能够深入了解这些领域,我会考虑回答.所以请帮我选择......
javascript web-applications code-organization javascript-framework backbone.js
我正在为我的ASP.NET MVC应用程序中的每个屏幕创建视图模型.我将所有逻辑用于在构建器类中创建视图模型.通常,存在用于将数据对象转换为视图模型的特殊逻辑,包括聚合,过滤和排序.每个构建器都传递一个依赖集,该集合包含每个依赖项(存储库,其他构建器等)的属性.
问题是我的名字变得非常长.依赖集通常具有以这种方式组成的名称:
视图模型名+生成器+ DependencySet
视图模型通常具有由您当前和孩子组成的名称.例如,我的系统已对提供者定义进行了分类.因此,为了在类别下显示提供者定义,我有一个名为的视图模型:
CategoryProviderDefinitionListViewModel
它看起来像这样:
public sealed class CategoryProviderDefinitionListViewModel
{
public long CategoryId { get; set; }
public string CategoryName { get; set; }
public ProviderDefinitionViewModel[] ProviderDefinitions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以,我的建设者被召唤
CategoryProviderDefinitionListViewModelBuilder
所以,我的依赖集被调用
CategoryProviderDefinitionListViewModelBuilderDependencySet
这几乎不适合整个屏幕.我可怜的手指累了.此外,一些屏幕几乎显示相同的数据,因此它们的视图模型名称几乎相同.当我查看我的文件夹时,很难找到我正在寻找的特定视图模型类.
理想情况下,我可以将视图模型类组合在一起,将它们与使用它们的视图相关联.避免碰撞并使名称尽可能短,同时保持它们的意义,这将是一件好事.有没有人发现在这种情况下运行良好的命名约定/文件夹组织?
我有一个巨大的控制器,我将它拆分为子控制器,我根据其功能将其放入其他文件中.
一切都很好,但我需要一个建议和问题的答案:我做得对吗?
这是一个巨大的控制器:
function controller($scope, $http) {
//code
someFunction($scope, boolA, function1, function2);
//code
}
Run Code Online (Sandbox Code Playgroud)
这是我在其他文件中的子控制器的代码,我在前端控制器后加载:
function someFunction($scope, boolA, function1, function2) {
//code where I use all the parametrs of function
function someFunctionSubcontoller() {
//here is used another function from other subcontroller
}
}
Run Code Online (Sandbox Code Playgroud)
将函数作为参数发送是否可以?我是否可以不从子控制器返回任何东西,因为$ scope会监视所有内容吗?我是否可以在另一个中使用控制器的某些功能?
现在我看到这不好,不对,但我需要拆分主控制器,因为它中有超过10k行的代码.
感谢您的建议和帮助!
我们为Angular 1编写的网站提供了多种工具,用于订单跟踪,定价报价等.它具有非常正常的npm结构
root/
??? build/
??? src/
? ??? scripts/
? ??? assets/
? ??? app.js
| ??? node_modules/
| ??? build/
??? package.json
??? webpack.config.js
Run Code Online (Sandbox Code Playgroud)
现在我们要创建一个桌面应用程序,我们决定使用Electron,因为我们已经为网站编写的所有工具都可以正常工作.基本上,计划是扩展网站代码,并使用构建开关隐藏一些仅限桌面的功能.
所以我的问题是,设置文件夹结构的最佳方法是什么?Electron使用子项目(按照约定在./app文件夹中).现在,我把它设置成这样
root/
??? app/
??? build/
??? dist/
??? src/
? ??? assets/
| ??? build/
| ??? node_modules/
? ??? scripts/
? ??? app.js
??? package.json
??? webpack.config.js
Run Code Online (Sandbox Code Playgroud)
当我们构建我们的网站时,Webpack将src文件夹编译为build.对于Electron,我们添加了其他步骤,build然后将其内容复制到app(电子子项目文件夹),并运行电子构建,输出到dist.
这有效,但看起来很骇人.有一个更好的方法吗?或者更好的方式来拥有"电子"分支和"网络应用程序"分支?
我很难设置我的代码来创建一个实时动画图,我的代码是在收集数据后绘图,而不是每次迭代都显示.我的脚本运行一个回归函数,然后存储在一个文件中,然后我访问这些文件并绘制它们,这里是我所拥有的,我需要移动或更改为实时图形?我尝试在for循环中移动绘图函数但是没有用,有什么建议吗?
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
num = 10
for idx in range(1,num):
c,e = Regr_magic()
with open("CK_output.txt",'a') as CK:
CK.write("{0},{1}\n".format(idx,c))
with open("error_output.txt",'a') as E:
E.write("{0},{1}\n".format(idx,e))
def animate(i):
pull = open('error_output.txt','r').read()
data = pull.split('\n')
xar = []
yar = []
for each in data:
if len(each)>1:
x,y = each.split(',')
xar.append(float(x))
yar.append(float(y))
ax1.plot(xar, yar)
ani = animation.FuncAnimation(fig, animate, interval=1000)
plt.show()
Run Code Online (Sandbox Code Playgroud)
仅供参考,数据文件包含以下内容,迭代编号和Ck值或错误,因此它们看起来像这样
1,.0554
2,.0422
3,.0553
4,.0742
5,.0232
Run Code Online (Sandbox Code Playgroud) c++ ×3
javascript ×2
.net ×1
angularjs ×1
backbone.js ×1
c++-cli ×1
coding-style ×1
compilation ×1
css ×1
electron ×1
matplotlib ×1
performance ×1
python ×1
viewmodel ×1
visual-c++ ×1
wrapper ×1