为什么面向对象糟透了?

自动驾驶仿真:基于Carsim开发的加速度请求模型 1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要给控制器仿真加速度的信号,控制器才会实现对纵向功能的控制。2、Carsim或者其他动力学软件,主要提供者节气门开度和主缸压力进行控制。我们在进行联合仿真时,往往都要通过PID的方式将请求加速度转换成对应的节气门开度与主缸压力传给动力学软件进行闭环控制。 阅读详情

又是周末,编程语言“三巨头”Java, Lisp 和C语言在Hello World咖啡馆聚会。

服务员送来咖啡的同时还带来了一张今天的报纸, 三人寒暄了几句, C语言翻开了报纸,突然眼前一亮:“这篇文章的标题写得好啊, 《为什么面向对象糟透了!》”

(这是一篇很早之前的文章,作者是大名鼎鼎的Joe Armstrong , 也就是Erlang之父。)

Java 大吃一惊,居然有人这么骂面向对象?!

他赶紧抢过来,看了一会儿,说到:“虽然我对去世的Joe Armstrong老先生非常尊敬,但是我对他的观点却不敢苟同,你看他说'数据结构和函数不应该绑到一起!'”

C语言说:“他说得很有道理啊,函数是实现算法的,就像一个黑盒子,只要理解了它的输入和输出,就理解了它的功能,而数据结构呢就是单纯的‘声明’,为什么要把他们绑在一起呢?”

“不不不,还是绑在一起好!我给你举个例子,一个栈,如果你把它当成一个完整的对象,那用起来就方便多了。”

Stack s = new Stack();

s.push(100);

s.push(200);

s.pop();

C语言不甘示弱:“把数据结构和函数分开也挺好啊!比如我可以创建一个叫做Stack的数据结构,然后写几个对这个数据结构操作的函数。”

push(stack, 100);

push(stack, 200);

pop(stack);

Java不屑一顾地说:“你看看你这种方式多丑陋啊。”

C语言寸步不让:“本质都是一样的,你是o.f() ,我是f(o),  有啥区别?”

Lisp也插了一嘴:“还有我的(f o) ”

2

Java无语,心说这两个家伙就是胡搅蛮缠。突然,他心中一动:我怎么忘记多态了。

Java说:“本质是不一样的,你要知道,o.f()是可以产生多态行为的,这就带来了巨大的好处,我给你举个例子,你有一段业务逻辑,需要把计算的结果记录到文件中,将来还可能会记录别的地方,你的设计可能是这样的。”

640?wx_fmt=png640

C语言:“难道不应该如此吗?一个函数调用另外一个函数?”

Java 说到:“这里有个依赖的问题,就是businessLogic()不但运行期依赖writeToFile(), 在源码级或者编译期也会依赖。”

C语言:“这不是很正常嘛!”

Java又说道:“不一样, 写入文件是底层的实现细节,不是高层策略,假如用户不想把计算的结果保存到文件中了,而是想通过邮件发送,那你的businessLogic也得修改了,对不对?”

640

640?wx_fmt=png

C语言:“那肯定啊!函数调用嘛,一个改了,另外一个也得改。”

“这就是问题了, 编译期/源代码的依赖导致我们没法把系统划分成独立的组件,各自独立开发,独立部署,一个的变化就影响到了另外一个。”

C语言觉得有一定的道理,他说:“那怎么办?”

Java说:“你看看我使用多态以后的设计,我的业务逻辑在编译时只依赖那个接口Writer,而不依赖具体的实现FileWriter和MailWriter。”

640

640?wx_fmt=png

“你的意思是只要接口Writer不变化,底层的具体实现如FileWriter ,MailWriter可以随意变化,随意替换,就像插件一样,对吧?”  C语言说到。

“对啊,编译期/源代码不依赖,运行期依赖,这就是延迟绑定带来的好处,现在你明白o.f()和 f(o)的本质区别了吧。 ”

Lisp 不失时机又插了一嘴:“你那接口中只有一个函数,就是write(),用什么接口啊,脱裤子放屁,多此一举,在我这儿只要把不同的函数传递过去就可以了。”

Java笑道:“别抬杠,这就是个简单的例子,不管是用接口,还是传递函数,都是延迟绑定嘛, 关键点都是要找到那个稳定的东西(Writer),就是抽象。你找不到这个稳定的东西,做不出抽象,你的系统就没法划分成可以独立开发,独立变化的组件了。”

C语言还想反击,但一直找不到突破口。

Lisp说道:“别听Java在哪里忽悠,C老弟,你也能实现运行期的延迟绑定,这不是Java的专利,你忘了虚函数表了?”

C语言一拍大腿:“是啊,我忘了那一年春节回家,Linus 大神曾经告诉我,虚函数表和函数指针才是实现多态的关键,比如Unix/Linux把设备都当成了文件,有标准的open , read 等方法,对于不同的设备,都能调用对应的方法, 那是怎么实现的?也是通过虚函数表做延迟绑定嘛!”

(码农翻身老刘注:C语言实现面向对象的详情可以移步《

C语言高兴了:“哈哈,Java 老弟,看来我们本质上还是一样的,多态只不过是函数指针的一种应用!”

Java说:“所以编程的关键不在于是否使用了面向对象的语言,这一点你同意吧?”

C语言点头,编程的关键点就是找到、抽象出稳定的接口,针对这个接口编程,这样就可以让各个模块能够独立地变化。

3

“说起来容易,做起来难,这儿有一个例子,你给我用面向对象设计一下?”  Lisp 抛出了一道题。

动物可以分为肉食动物,草食动物,水生动物,陆生动物,用类如何表示?

Java 说:这还不简单,看看这名词多明显啊,都可以变成类啊,让他们都继承动物就可以了。

640

640?wx_fmt=png

Lisp看到Java 掉入了陷阱,狡黠地一笑:“那有的动物就既是陆生动物,又是肉食动物,怎么表达?”

“那我就加一个陆生肉食动物类。” 虽然觉得不妥,Java还是说了出来。

640

640?wx_fmt=png

“那要是再来一个水生肉食动物怎么办?或者来了一个新的概念‘哺乳动物’, 该怎么处理?”

“哈哈哈,我懂了,随着需求的增多,不但类会出现爆炸, 还可能会出现那种怪异的类,这面向对象编程确实是有大问题啊!”  C语言说。

Java 低头沉思不语,突然,脑海中想起来了那句话:优先使用组合而不是继承。

怎么使用组合?必须得改变下看待问题的方式,对,应该这样:

640

640?wx_fmt=png

Java得意地说:“看看这个图, 动物具备多个特性,如'进食', '移动',将来还可以加上'哺乳方式',每个特性都是一个接口,接口是稳定的, 动物这个概念是可以通过这些接口特性给组合起来的。”

Lisp 赞赏地点头, C语言向Java投去了钦佩的目光,这家伙经常做面向对象的设计,还是有两把刷子的,他通过特性的方式把变化给隔离了, 各个特性可以通过组合的方式,像插件一样随意替换, 嗯,这才是面向对象的真正精髓啊。

夜已深, 最后Java做了个总结,大伙散去。

“编程嘛就是发现变化,并且把它给隔离起来,使用各种语言都可以,面向对象的语言有着直接使用多态的便利,以后不要随随便便就diss它了。”

参考资料:

http://www.cs.otago.ac.nz/staffpriv/ok/Joe-Hates-OO.htm

《敏捷软件开发:原则,模式与实践》

《架构整洁之道》

《面向对象开发参考手册》

关于作者:

,15年以上软件开发经验,畅销书《》作者,前 IBM 架构师,领导过多个企业应用架构设计和开发工作;洞察技术本质,擅长用故事去讲解复杂技术。

往期精彩回顾

640?wx_fmt=jpeg

vue3+vite - 解决报错error while updating dependencies:Error:EACCES:permission denied,mkdir ‘x‘(系统权限问题) vue3,vite,报错,nuxt,权限,苹果mac系统,windows系统,vue3报错,vite报错,node,详细解决方法,教程,[vite] error while updating dependencies: Error:EACCES:permission denied,mkdir 'x',更新依赖项时发生[vite]错误:错误:EACCES:权限被拒绝,mkdir,苹果mac系统加了sudo还是不行报错,运行报错,启动项目,run dev,创建项目,初始化,依旧不行怎么办,保权限没有问题,换了n 阅读详情

相关推荐

保姆级教程:DBeaver社区版安装与驱动配置(附阿里云镜像解决下载超时)

本文提供DBeaver社区版的保姆级安装教程,涵盖版本选择、安装路径设置到驱动配置优化。特别针对国内用户遇到的下载超时问题,详细介绍了如何配置阿里云镜像加速驱动下载,确保高效连接MySQL等主流数据库。

weixin_30430169的博客 479

面向对象编程是计算机科学的最大错误

原文发表于博客:blog.zhangbing.site C++和Java可能是计算机科学中最严重的错误。两者都受到了OOP创始人Alan Kay本人以及其他许多著名计算机科学家的严厉批评。然而,C++和Java为最臭名昭著的编程范式–现代OOP铺平了道路。 它的普及是非常不幸的,它对现代经济造成了极大的破坏,造成了数万亿美元至数万亿美元的间接损失。成千上万人的生命因OOP而丧失。在过去的三十年里,没有一个行业不受潜伏的OO危机的影响,它就在我们眼前展开。 为什么OOP如此危险?让我们找出答案。 想象一..

前端全栈开发者 555

Pytorch中CrossEntropyLoss()详解

交叉熵主要是用来判定实际的输出与期望的输出的接近程度。举个例子:在做分类训练的时候,如果一个样本属于第 K 类,那么这个类别所对应的输出节点的输出值应该为1,而其他节点的输出都为0,即 [0,0,1,0,….0,0] ,这个数组也就是样本的 Label,是神经网络最期望的输出结果。我们用交叉熵损失函数来衡量网络的实际输出与正确标签的差异,利用这种差异经过反向传播去更新网络参数。交叉熵:它主要刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。

flyingluohaipeng的博客 3861

关于两个世界体系的对话

为什么80%的码农都做不了架构师?>>> ...

weixin_33752045的博客 342

MiniMax H3本地部署与ComfyUI集成实战:从环境配置到提示词优化

文本到视频生成是AI内容创作领域的关键技术,它基于扩散模型等深度学习原理,将自然语言描述转化为连贯的动态视觉序列。这项技术的核心价值在于大幅降低了视频制作的门槛,为短视频创作、概念可视化、教育内容生成等场景提供了高效工具。在实际工程实践中,成功部署和运行此类模型,如近期备受关注的MiniMax H3,需要精准处理环境配置、显存优化和提示词工程等环节。其中,解决“CUDA error: no kernel image is available”等版本兼容性问题,以及针对“8G显存”等有限资源进行参数调优,是确

weixin_33674976的博客 479

Colmap论文——《Structure-from-Motion Revisited》论文阅读笔记

  最近又将Colmap论文翻出来仔细阅读总结了一下,于是顺便写个博客记录一下。Structure-from-Motion Revisited是当前SOTA的增量式SfM算法Colmap的论文,发表于2016年计算机视觉顶会CVPR。它是增量式SfM里程碑式的作品。 论文地址:https://openaccess.thecvf.com/content_cvpr_2016/papers/Schonberger_Structure-From-Motion_Revisited_CVPR_2016_paper.p

zeeq的博客 1万+

面向对象的弊端是什么(转)

有时候,如果只记得面向对象是一种对现实世界理解和抽象的方法,那么整个设计开发将无比糟糕

涂抹 385

ARM CoreLink 系列 5.1.1 -- CI-700 System Address Map 】

所有的CHI 命令都包含一个 Source ID 和 Target ID, 其中 Source ID 可以来自于 RN Node, Target ID 可以来自于HN node或者其他 SN node. 其中 Target ID 是通过 SAM解析传入的地址得到的。对于 CI-700中的所有 RN Node 中的 SAM 多会进行配置,因为RN Node 访问的是整个地址空间,不同的地址空间会有不同的属性(I/O, DRAM),所以会对RN SAM 配置多个不同属性的区域。

CodingCos的博客 771

设计出来的软件可靠性能达到9个9的程序设计语言

  一、高可靠性的Erlang,有望取代Java  Erlang将成为一个非常重要的语言。它也许就是下一代的Java语言。目前Erlang发展的主要问题就在于没有一个大的公司来支持它,作为它强大的后盾。结果,Erlang被推动成为一个开源的项目。Erlang语言最大优势就是它非常适合多核,web服务的特点。事实上,Erlang是唯一成熟的,非常稳定可靠,适合开发运行在多核机器上的高伸缩性的系统

meteor2520的专栏 1123

FFDNet-pytorch版本代码训练教程

该文章为FFDNet-pytorch版本代码训练教程,抓紧订阅学习!尽早入门发论文哦!

假技术Po主 1507

图机器学习(2)——图的可视化

图结构可通过图形化方式直观呈现。节点通常用圆形表示,边则用连接线表示。然而当节点和边数量增加时,绘制清晰的图形表示可能会变得相当困难,这主要源于节点在二维坐标系中的布局问题。对于包含数百个节点的图,手动指定每个节点的坐标显然不切实际。在本节中,我们将介绍如何在不指定每个节点坐标的情况下绘制图形。我们将利用两种不同的解决方案:networkx 和 Gephi。

盼小辉丶的博客 8771

现在听到,看到面向对象就有想吐的感觉

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33841722的博客 157

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

漫画 | 为什么面向对象糟透了!

又是周末,编程语言“三巨头”Java, Lisp 和C语言照例在Hello World咖啡馆聚会。对于三位老顾客,服务员总是殷勤接待(码农翻身注:这是一篇很早之前的文章,作者是大名鼎鼎的J...

码农翻身 8623

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java面向对象例子_为什么面向对象糟透了?

编程语言“三巨头”Java, Lisp 和C语言在Hello World咖啡馆聚会。服务员送来咖啡的同时还带来了一张今天的报纸, 三人寒暄了几句, C语言翻开了报纸,突然眼前一亮:“这篇文章的标题写得好啊, 《为什么面向对象糟透了!》”Java 大吃一惊,居然有人这么骂面向对象?!他赶紧抢过来,看了一会儿,说到:“虽然我对去世的Joe Armstrong老先生非常尊敬,但是我对他的观点却不敢苟同,...

weixin_31978571的博客 101

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

漫画 | 为什么面向对象糟透了

又是周末,编程语言“三巨头”Java,Lisp和C语言照例在Hello World咖啡馆聚会。 对于三位老顾客,服务员总是殷勤接待 原来这是Erlang之父Joe Armstrong写的一篇“战斗檄文”,里边充满了对面向对象的批判 Java看到C语言这么顽冥不化,决定上代码,给他点儿颜色瞧瞧。 没想到C语言不甘示弱,也把代码搬了出来 Java无语,心说这两个家伙就是胡搅蛮缠。 突然,他心中一动:我怎么忘记多态了! Java看到C语言已经入套,...

qfguan的博客 506

为什么你写的代码糟透了?

我经常在 Reddit 或 Quora 上看到有人问“怎么知道自己是否可以成为一名成功的程序员”?。当有人在考虑职业转型,或者对软件开发感兴趣,并且对软件开发所涉及的内容感到好奇时,就不可避免地会问这样的问题。事实上,对于那些没有正式接受过计算机培训的人来说,这个问题会成为他们脑子里的一个主要障碍。他们会很自然地认为,如果自己不擅长编程,是否可以往这方面想?就好像你想成为一名演员,但又怀疑自己是否...

weixin_33790053的博客 101

也谈为什么面向对象很糟糕

其实我的编程之路应该是自学的:二十年前中学时上过一次微机课,大家照着课本用BASIC播放了音乐,然后编程的神奇勾起了我少年的好奇。后来微机课基本没上了,自己去新华书店买了一本PASCAL编程的书籍,因为没有电脑,这本书放在我的枕边,始终不得入门。但到高中时,神奇的事情发生了:某天突然无聊又捧起这本书看,看着看着我突然发现我看懂了,而且学会了编程。事情就是这么神奇:我是通过PASCAL学会的编程,但...

cpq37的专栏 826

面向对象

面向对象相信大家听得不少了,但是实际上的真正能明白讲清除的不多,让我们来谈谈吧~~ 一、对象 简单来说,对象就是一个黑盒子,里面封装许多你不了解的东西,它有许多属性和方法供你使用~~ 对象的组成就是: 1.属性———变量,放到特定对象上就称为属性 2.方法———函数,放到特定的对象上就称为方法 二、面向对象 简单来说,面向对象是一种思想,而面向对象编程就是“构造出一个能帮你...

anshaobiao6449的博客 197

浅谈面向对象

什么是面向对象? 1、面向对象有三大特性:封装、继承、多态 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 面向过程的解决方法 开门(冰箱); 装进(冰箱,大象); 关门(冰箱)。 面向对象的解决...

高山景行,一尘不染 800

面向对象技术浅析

蒟蒻讲一下自己对面向对象的理解

T_T233333333的博客 573

重新思考面向对象

重新思考面向对象 封装 继承 多态这些只是面向对象的特征,并非其本质 经典例子 Jeff Goodell:请你用尽量简练的语言解释一下,究竟什么是面向对象的软件? 如果我是一个“洗衣”对象,你可以把脏衣服给我,然后告诉我说:“请帮我把这些衣服洗了吧!”而我恰好知道旧金山最好的洗衣房在哪,并且我会说英语,兜里也有美元。于是我出门大了一辆出租车,告诉司机带我去位于旧金山的洗衣房。我到了那里洗好衣服之后,又坐车回到这里。我把洗好的衣服交还给你,说:“你的衣服已经洗好了。” 你并不知道我是怎么做到的。你不知

C_Sephiroth的博客 239

面向对象的编程:一场万亿美元级的灾难

本文剖析了为什么是时候远离OOP了。

风语留痕 581

什么是对象的消息_面向对象的编程:一场万亿美元级的灾难

欢迎关注我的头条号:Wooola,10年Java软件开发及架构设计经验,专注于Java、Golang、微服务架构,致力于每天分享原创文章、快乐编码和开源技术。作者:Ilya Suzdalnitski是加拿大阿尔伯塔省Calgary公司的资深全栈工程师。本文剖析了为什么是时候远离OOP了。OOP被许多人认为是计算机科学界皇冠上的明珠,是编程部门的终极解决方案,可以消除我们的所有问题,是编写程序的唯一...

weixin_39884832的博客 235

2013年php,为什么说2013是PHP年

2012是PHP讨论交流非常优秀的一年,不仅由于很多迫切的新功能被加入到了PHP5.4当中,而且无数的项目,都上升了一个新的高层次。本篇我想带这大家看看过于PHP带来了什么问题,并且展望下2013年PHP可能会为我们带来些什么。需要和哪些做抗争?这个可能对你来说很惊讶,但是很多人对那些PHP开发者以及语言这个整体都会产生负面的情绪。如果你由于某种意义上的一点压力,在过去几年已经深入学习Ruby,你...

weixin_32824711的博客 160
上一篇: 三年,足以完成从双非到互联网大厂的跳跃
下一篇: 当世界上只剩下最后一个Java程序员
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论 109
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值