java尾行注释有什么不好_注释不好吗?

java尾行注释有什么不好

那天,我在有关Spring XML与注释的文章中运用了自己的原则,轻松进入了这个主题。 对于目前正在编写此新应用程序的团队来说,这种简单的输入方式也是我不使事情复杂化的方式,该应用程序的生产寿命可能为3-5年(如果我们做得对,并希望技术世界的话)不会改变它的头)。

从1.1开始我就一直在使用Spring Days,所以是的,我对使用非常大和复杂的XML感到很满意。 但是,我知道如何写它们,更重要的是,我知道如何阅读它们。 从那时起,Spring使开发人员易于理解它们-带有Beans Explorer / Graph的Spring STS。 现在,开发人员无需担心查看多个XML,这些工具甚至可以为他们编写和管理bean来完成工作。

为了提高开发人员的生产力,短期内我们会牺牲编写优质性能代码的技巧

自从我看到Spring 3.x引入了基于注释的配置这一概念以来,使用这些注释而不是使用XML的炒作至少已有7年之久(如果我没记错的话)。 我无法通过改变方向来实现和平。

不说不好
,但是此功能几乎没有被社区滥用,而是Spring一直在推广滥用行为。 今天的任何Spring文档都只讨论注释样式的编码,然后再遵循“经典XML方式”进行处理。

人们说- 阅读代码 更容易,使用批注中的代码调试代码更容易 ,他们忘记了代码中不再存在的代码-他们在代码中嵌入了配置。 据我所知,配置应该被外部化。 在我们使用Hibernate和JPA之类的ORM框架的情况下,问题更加严重。

即使在原始的Spring Design中,甚至在使用XML的情况下,我都觉得设置Spring应用程序的方式并不是Spring设计的目的。 是时候让我去了解罗德·约翰逊(Rod Johnson)设计Spring时的想法了(我知道一点,但是我需要找到一些细节并深入了解)。 但这就是另一天。

因此,让我们看一下该博客文章 ,其中解释了如何将JPA与Spring一起使用或阅读此StackOverFlow线程 。 很好,他们都解释了如何使用,但是很快我们意识到,但是在代码中使用这些所谓的基于Rich Annotation的配置,我们已经淡化了代码/设计应该是的总体含义。 当我必须尝试一些新的事物作为个人宠物项目以快速起步时,这种编程风格非常有用–我可以编写一堂课,键入一些注释并Swift做好准备进行CRUD的准备,但这确实有效在企业级应用程序中,尤其是我们如何在生产中进行管理。

这些文章不过是一堆希望我们使用这些框架和新功能的市场营销/销售推销,但它们几乎没有将我们在大型生产系统中必须处理的复杂情况置于上下文中。

在2007年,我们在项目中广泛使用了Hibernate模式(带有基于XML的Spring 2.x配置),很快我们意识到,我们已经将ORM框架超越了它的范围。 我们遇到了复杂的查询,试图将其改编到Hibernate中,并且有可能在MS-SQL中将其作为优化的过程来编写,而消除这些查询现在正成为主要瓶颈。 我刚接触过该框架,但更重要的是,我的技术领导力推动了Hibernate的全面使用。 这些人可以访问我之前分享的文章,这看起来很可行,但是他们不过是销售Hibernate和ORM带来的功能的营销材料。 当我遇到麻烦时,我不得不回头去重构代码,并遵循良好的旧查询编写方法。

这些使用注解的框架在90%的情况下都能很好地工作,但是当这些注解失败时,您需要系统在压力下执行的那10%正是

现在回溯到Spring和Annotations –为什么我不喜欢它们? 仅仅是因为它们使我像在学习某个东西的大学生一样编写代码。 他们迫使我摆脱过去黄金时代的良好做法。 是的,它过去需要花费一些时间来建立一些类,还花费时间来编写SQL查询,但是我在正确的地方放置了正确的东西。 是的,我们花了很多时间才能蓄势待发,但一旦我们紧紧设置了这些基础知识,不仅可以提高开发速度,而且还可以正确地完成事情。

是的,没有人可以强迫我们,但是普通的Joe开发人员或普通的Jim建筑师没有时间和意愿来制作这些POV,他们在Google上进行搜索,当他们看到5篇文章说同样的话时,他们以为是做正确的事,他们会快乐地前进。 我们的许多高级技术人员(也阅读这些文章)都支持这种设计,并且很多时候都在挑战我要在此处提出的观点。

TLDR;

考虑一下,请不要使用注释来配置您的应用程序。 配置从来都不打算成为代码的一部分-之所以称为配置。 所以,让这些成为现实。 短期内获得少量收益不会大有帮助,特别是当客户要求更改表或值并且您告诉他这将需要5天的开发,测试和部署时。

翻译自: https://www.javacodegeeks.com/2015/08/are-annotations-bad.html

java尾行注释有什么不好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python输出结果为none_python的reverse函数翻转结果为None的问题

今天刷二级题的时候,遇到一个问题>>> L2[1,2,3,4]>>> L3L2.reverse()>>> print( L3)None>>> print(L3)None>>> print(L2.reverse())None其实我想让它输出[4,3,2,1]reverse函数,翻转列表然后我改了一下>…

性能测试流程_流性能

性能测试流程当我阅读Angelika Langer的Java性能教程时-Java 8流有多快? 我简直不敢相信,对于一个特定的操作,它们花费的时间比循环要长15倍。 流媒体性能真的会那么糟糕吗? 我必须找出答案! 巧合的是,我最…

C++vector用法总结

点击蓝字关注我们来源自网络,侵删一.vector1. vector 说明1)vector是C标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。2.)vector之所以被认为是一个容器,是因为它能…

python中创建集合的语句_Python 集合(set) 介绍

集合 set集合是可变的容器集合内的数据对象都是唯一的(不能重复多次的)集合是无序的存储结构,集合中的数据没有先后关系集合内的元素必须是不可变对象集合是可迭代对象(可以用for等遍历)集合是相当于只有键,没有值的字典(键则是集合的数据)创建空集合&am…

C++ STL 线性容器的用法

点击蓝字关注我们来源于网络,侵删1.vectorvector 是顺序容器的一种,是可变长的动态数组,支持随机访问迭代器,所有stl算法都能对 vector 进行操作。vector 容器在实现时,动态分配的存储空间一般都大于存放元素所需的空间…

redis复制_Redis复制

redis复制本文是我们学院课程的一部分,标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外,您还会在Redis命令行上乱七八糟。 接下来是更高级的主题,例如复制,分片和集群&#xff0c…

python打开.data_DataX初体验-python命令启动以及纯java启动

一、DataX安装官网描述很详细,很简单---->DataX安装二、使用示例:从Oracle数据库导数据到Mysql数据库事先准备:Oracle数据库的ORDER_INFO表,MySQL数据库的order_info表,表结构相同2.1使用Python启动生成模板文件打开…

java高级教程_高级Java教程

java高级教程课程大纲 学习Java基础很容易。 但是,真正钻研该语言并研究其更高级的概念和细微差别将使您成为一名出色的Java开发人员。 网络上充斥着“软”,“便宜”,“低端” Java教程,但是所缺少的实际上是将您带入新的高度的材…

JavaWeb笔记之WEB项目

一. 版本控制 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。 版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变&a…

c++获取数组长度

点击蓝字关注我们来源于网络&#xff0c;侵删方法一&#xff1a; 用宏函数 #define#define foo(arr) sizeof(arr)/sizeof(arr[0])int main(){int arr[4] {1,2,3,4};cout<<foo(arr)<<endl; }方法二&#xff1a;用函数模板int getArrLen1(int *a ){return sizeof(a)…

python从列表随机取出多个数据_【python】从数组随机取数据

在神经网络中&#xff0c;经常会用到批量样本训练。我们需要从数组随机取数据&#xff0c;主要有以下几种方法&#xff1a;1、np.random.shuffle&#xff1a;将原数组打乱import numpy as nparray np.random.randint(1,100,size10)#[63 32 80 33 61 45 28 55 39 80]batch_size…

java代理模式_Java代理

java代理模式本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的旅程&#xff01; 在这里查看 &#xff01;…

如何用python抢课_名额不够,技术来凑,利用Python实现教务系统强制性抢课

这个不是一个点击脚本&#xff0c;而是属于扩容性质的脚本。名额不够咱们利用技术来解决&#xff01;最近一学期一次的抢课大戏又来了&#xff0c;几家欢乐几家愁。O(∩_∩)O哈哈~(l我每次一选就过了hah&#xff0c;我还是有欧的时候滴)。看着他们盯着教务系统就着急&#xff0…

C++ 利用硬件加速矩阵乘法

点击蓝字关注我们来源于网络&#xff0c;侵删1.矩阵乘法定义2.矩阵类封装我们用 C封装了一个n m 的矩阵类&#xff0c;用二维数组来存储数据&#xff0c;定义如下&#xff1a;#define MAXN 1000 #define LL __int64class Matrix { private:int n, m;LL** pkData; public:Matri…

redis分片_Redis分片

redis分片本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外&#xff0c;您还会在Redis命令行上乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c…

python tkinter窗口切换_tkinter--实现简单的页面切换

[Python] 纯文本查看 复制代码import tkinter as tkindex_num 4def up_page():info frame_root.place_info()x int(info[x]) 100y info[y]frame_root.place(xx, yy)global index_numindex_num 1index[text] "第 {} 页".format( index_num)def down_page():inf…

解析C++全排列

点击蓝字关注我们来源于网络&#xff0c;侵删1.C实现全排列的函数next_permutation(start,end)这个函数在暴力解决问题方面有很大作用&#xff0c;使用时需要引入头文件 < algorithm >&#xff0c;当当前序列不存在下一个序列时就会结束&#xff0c;若想得到一个序列的全…

python读写文件代码_Python 读写文件的操作代码

Python读写文件模式1、r 打开只读文件&#xff0c;该文件必须存在。2、r 打开可读写的文件&#xff0c;该文件必须存在。3、w 打开只写文件&#xff0c;若文件存在则文件长度清为0&#xff0c;即该文件内容会消失。若文件不存在则建立该文件。4、w 打开可读写文件&#xff0c;若…

redis开启redis_Redis聚类

redis开启redis本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外&#xff0c;您还会在Redis命令行上乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#…

C++ 读取文件操作

点击蓝字关注我们来源于网络&#xff0c;侵删1.先上代码&#xff1a;#include <fstream> #include<iostream> using namespace std;//文本文件读文件 void test01() {//1、包含头文件//2、创建流对象ifstream ifs;//3、打开文件并且判断是否打开成功ifs.open("…