我公司里有一位同事,他的意见我非常尊重,但我根本无法理解他在C++中编写代码的首选方式.
例如,鉴于有一些A类,他将编写该类型的全局函数:
void foo( A *ptrToA ){}
Run Code Online (Sandbox Code Playgroud)
要么:
void bar( const A &refToA ){}
Run Code Online (Sandbox Code Playgroud)
在看到这样的全球函数时,我的第一直觉是:"为什么不是A的这些成员?" 他会坚持认为这与C++中的良好实践建议是一致的,因为foo和bar可以通过使用A的公共接口执行他们需要执行的所有操作.例如,他会认为这是完全一致的与Scott Meyers有效的C++推荐.我发现很难将这与第19章中的第19项相协调,它基本上说一切都应该是一个成员函数,但有一些例外(operator <<和operator >>以及需要动态类型转换的函数).此外,虽然我同意的功能可以做他们需要一个公共接口做什么,在我看来,这主要是人写有getter和setter类因此与A级的每一个数据成员的结果公共接口,A是一个过度美化的结构,你当然可以使用公共接口做任何事情.就个人而言,我认为不应该被剥削,我认为应该气馁.
显然,这只能用于像C++这样不是纯面向对象的语言,所以我想一种看待它的方法是我的同事不喜欢纯粹的面向对象的软件设计方法.有没有人知道任何支持这种立场的文献作为最佳实践?或者是否有人同意这一点,并且可能以与我的同事不同的方式向我解释,以便我可以看到光明?或者每个人都同意我目前的感觉,这只是没有多大意义?
编辑: 让我给出一个更好的代码示例.
class Car
{
Wheel frontLeft;
Wheel frontRight;
Wheel rearLeft;
Wheel rearRight;
Wheel spareInTrunk;
public:
void wheelsOnCar( list< Wheel > &wheels )
{
wheels.push_back( frontLeft );
wheels.push_back( frontRight);
wheels.push_back( rearLeft);
wheels.push_back( rearRight);
}
const Wheel & getSpare(){ return spareInTrunk; }
void setSpare( const Wheel &newSpare ){ spareInTrunk = newSpare; }
// There are getters and setters for the other …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Angular 2应用程序中使用ag-grid.因为我使用无限滚动和服务器端过滤,我基本上希望网格中的所有列都有自定义过滤器,然后我可以将其传递到实际执行过滤的服务器.虽然ag-grid有一个相对简单的界面来设置这些自定义过滤器,但在ag-grid文档的Angular 2页面上注意到ag-grid使用了Angular 1编译,并且因为Angular 2不支持编译应用程序启动后,网格中的任何自定义组件(自定义过滤器,单元格,行等)都不支持任何Angular 2功能(如双向数据绑定等).
所以我一直在寻找一种Angular 2方法来动态地将组件加载到ag-grid插入其过滤器弹出窗口的DOM元素中.我已经查看了DynamicComponentLoader(已弃用)以及使用ComponentResolver的几种变体.一旦我获得了ComponentResolver,我可以调用resolveComponent来获取ComponentFactory然后我可以使用@ViewChild来获取ViewContainerRef并在该ViewContainerRef上调用createComponent来创建我的新组件.但是,这对网格没有帮助,因为@ViewChild不会像ag-grid那样直接找到动态添加到DOM的元素.
或者,一旦我获得了ComponentResolver并调用resolveComponent来获取ComponentFactory,我就可以在componentFactory上调用create并从我的ViewContainerRef传递它的注入器和我想要组件插入的元素的字符串标签,并且"似乎"工作,但组件未正确呈现.如果我使用DynamicComponentLoader(即组件未按预期呈现),我会得到类似的行为.
是否有一些可接受的方法在DOM中的特定元素中加载Angular 2 Component?
下面是一些代码来说明问题,我基于Angular 2快速入门:
app.component.ts:
import { Component, ViewChild } from '@angular/core';
import { ComponentResolver, ViewContainerRef } from '@angular/core';
import { DynComponent } from './dyn.component';
@Component({
selector: 'my-app',
template: `
<h1>My test Angular 2 App</h1>
<input type="text" class="form-control" required
[(ngModel)]="name" >
TODO: remove this: {{name}}
<p> </p>
<div #insertPoint>
<button (click)="createDynamicComponent()">Create The Dynamic Component</button>
Inserting a new component below this.
</div>`
})
export class AppComponent {
name: string;
@ViewChild('insertPoint', {read: …Run Code Online (Sandbox Code Playgroud)