管理好你的对象!

Python面向对象方法实现模拟银行管理系统!无所不能! 面向对象课后习题出了这个题目,思考以及查资料后许久终于搞定了,哎,老师是在为难我们咩!!! 代码如下: import prettytable as pt # 表格形式显示 import time bank_log = [] # 初始化银行交易日志 class Bank: '''银行类''' def __init__(self): """初始化""" self.money = 0 # 封装和初始化金额 self.bank_ 阅读详情
     这篇日志相当有份量,是我个人工作了一年来对面向对象软件开发的最高度了,希望同行也能看一看,给点意见!
      面向对象语言的核心是对象,怎样有效的生成,管理对象是面向对象软件开发中标志代码质量的核心!许多初学者在刚刚接触面向对象软件时往往仍然在用面向过程的思路开发。过了一段时间,他们会逐步体会到继承和多态的好处,逐渐以面向对象的思路进行开发。可是许多时候,开发出的系统的性能往往不勘忍受。许多人认为这是从面向过程到面向对象带来的最大弊端:那就是类的膨胀!
       的确,从面向过程到面向对象的确是会牺牲一些性能,但绝对不会到不堪忍受的地步。究其原因,其实是因为许多时候由于代码质量的问题,往往系统在运行时会产生大量冗余的对象(实例)。因此如何有效的生成对象并有效的管理对象,就成了区分优秀代码和劣质代码的重要标准。
      本来我是想以这个星期改进的那个系统做示例的,但是为了避免惹上不必要的麻烦我还是重新举个新的例子来说明管理对象的重要性。
      考虑你要实现一个图书管理系统,那么在这个系统中你一定会把书抽象成一个类Book,Book中会有id,name,author等等属性,你一定还会想到管理员需要把特定的书放在特定的位置,书是放在书架上的,为了更好的抽象,你还需要一个书架类Bookshelf。并且在Book中还会有Bookshelf类这个属性,标志这本书是属于哪个书架类的。
       好了,现在在你的数据库操作实现类中一定有这样一个方法,传递进来一个bookId,查询数据库,将数据库中的数据封装成一个Book实例,并返回。请看以下的部分代码
        Class Book{
             String bookId;
             Bookshelf bookshelf;
             public Book(String bookId){
                     this.bookId = bookId;
             }
             public void setBookshelf(Bookshelf bookshelf){
                      this.bookshelf = bookshelf;
             }
         }
         }
         Class Bookshelf{
             String bookshelfId;
             public Book(String bookshelfId){
                     this.bookshelfId= bookshelfId;
             }
        }
         接下来是那个数据库操作的部分代码,假设已经从数据库中取得ResultSet需要的数据
         Book book = new Book(rs.getString("FBookId"));
         Bookshelf bookshelf = new Bookshelf(rs.getString("FBookshelfId"));
         book.setBookshelf(bookshelf);
         return book;
      这样做无疑是正确的,但是一个大雪的图书馆藏书几十w本是很正常的,因此有些极端的情况下可能整个系统同时会存在1w个Book对象而且由于,在封装book的同时,又new了Bookshelf所以另外又有1w个Bookshelf对象!试问,这样的系统怎么不会不堪忍受呢?如果服务器的内存过小,系统很可能就崩溃了!
      我们必须改进这段劣质的代码!也许你已经想到书架的个数一般是固定的,很少会加一个书架减一个书架。另外书架的个数肯定是有限的一个书架能放500本书很正常这样20w的书也最多需要400个书架。因此在封装Book的同时在new一个Bookshelf完全没有必要,这样做会使系统产生大量的一模一样的Bookshelf这就是冗余!
      那怎么做呢?我们需要有一个类在系统初始化的时候就生成了这些Bookshelf并维护他。由于书架一般不会变,因此这么做是可行的,否则为了增加一个书架,而频繁重启系统也是无法忍受的!书架类的生成还是由书架类自己来控制。请看下面改进的代码。
Class Bookshelf{
 
 private String bookshelfId
 
 
 private Bookshelf(String bookshelfId){
  this.bookshelfId = bookshelfId;
 }
 
 static Bookshelf parse(rs) throws SQLException{
  Bookshelf bookshelf = new Bookshelf(rs.getString("FBookshelfId");
  return bookshelf;
 }
}
Class BookshelfManager{
 private static BookshelfManager myself;
 
 private Map<String,BookshelfManager> bookshelves = new HahsMap<String,Bookshelf>();
 
 
 private BookshelfManager(){
  init();
 }
 
 private init(){
  ...
  while(rs.next()){
   bookshelves.add(Bookshelf.parse(rs));
  }
  ...
 }
 
 public BookshelfManager getInstance(){
  if(myself == null){
   myself = new BookshelfManager();
  }
  return myself;
 }
 
 public Bookshelf getBookshelf(String bookshelfId){
  return bookshelves.get(bookshelfId);
 }
}
      在这里,Bookshelf的构造函数已经是private的了,即其他类不能创建这个类的对象,那怎么办了?完全由BookshelfManager来负责Bookshelf对象的创建和维护。BookshelfManager本身是singleton的在唯一的一次初始化中他将调用init()这里其实是查数据库中对应书架的一些信息,每一个rs就是一条表示书架信息的结果集,之后会调用Bookshelf的parse方法,由Bookshelf自己创建新的Bookshelf对象并把它放入BookshelfManager所维护的一张存放所有Bookshelf的map中。然后我们就可以在数据库操作方法中这样写了。     
         Book book = new Book(rs.getString("FBookId"));
         Bookshelf bookshelf = BookshelfManager.getInstance().getBookshelf(rs.getString("FBookshelfId");
         book.setBookshelf(bookshelf);
         return book;
         这样事实上,所有的Bookshelf对象都由BookshelfManager对象管理了,任何其他类都不能创建Bookshelf对象。事实上,我们注意到Bookshelf必须暴露出创建对象的parse方法。由于Java没有友元(否则就把BookshelfManage设成Bookshelf的友元了,而parse也可以设成private了),所以我们需要建立一个包用来只存放Bookshelf和BookshelfManager。
         怎么样,是不是觉得很神奇啊?!负责写数据库操作的人根本不用负责对象的生成和管理,同时有更好的负责管理Bookshelf的BookshelfManager来做有效合理的管理!
         现在,代码质量已经有显著提高了?但是你会觉得我们不可能像BookshelfManager一样写一个BookManager类,然后初始化的时候建立一张map存放所有的书!因为书很可能有几十w本!所以还需要在数据库操作中,负责Book的创建!
         不存放所有的书就存放部分的书呗!如果让数据库操作类负责Book对象的创建,仍然是不合理的,同时存在1w本书的实例仍然不是个好办法!
         于是我们可以创建一个BookManager类,在这个类中也存放一张map表,但是map这张表中的元素的个数必须是固定,但是可以在初始化是配置大小的!当传递过来一个bookId时,它会先看原来的map中有没有这个id的Book如果没有,则判断map的大小有没有到达上限,如果达到,他会随机去除一条记录,然后新建对应于id的Book放到map中,如果没有达到上限,则直接创建并插入。如果map中已经有这个id的Book则直接返回。
          事实上这就是一个池(Pool)的概念,J2EE的应用服务器所支持的连接池,线程池等功能正式基于这个思想而创建的!由于动态map表的情况比较复杂,就不给出Book的改进代码和BookManager的代码了,下面给出最终的数据库操作的代码!
         Book book = BookManager.getInstance().getBook(rs);
         Bookshelf bookshelf = BookshelfManager.getInstance().getBookshelf(rs);
         book.setBookshelf(bookshelf);
         return book;
        这样所有其他功能就只生成引用而非对象了!对象都有相关的管理类管理,并有该类本身创建!这样一个图书馆系统的Book和Bookshelf对象在极端情况下也不会超过1k个了!
        这就是优质的代码!因此请管理好你的对象吧! 
 
 
【代码可复用!】腾讯云 COS 对象存储管理与文件上传封装 使用CosManager和类的前提是开通腾讯云对象存储(COS)和数据万象(CI)服务,并完成相关配置。通过合理的设计和封装,您可以轻松实现文件的上传、下载、处理等功能,提升开发效率并降低维护成本。希望本文的详细说明能帮助您顺利使用腾讯云 COS 和 CI 服务,并为您的项目提供高效稳定的文件管理能力。通过CosManager和两个类的封装,我们实现了对腾讯云 COS 服务的统一管理,简化了文件上传和处理的流程。这种设计不仅提高了代码的复用性,还增强了系统的可维护性和安全性。 阅读详情

相关推荐

Java中的内存池与对象池管理!

在高性能、高并发的Java应用中,内存池与对象池技术被广泛应用来优化内存管理和资源利用率。池化技术通过复用对象或资源,避免了频繁的对象创建和销毁,减少了内存分配的开销,并有效降低了垃圾回收(GC)的负担。尤其在需要频繁使用某些资源(如数据库连接、线程、网络连接等)时,池化技术可以显著提升系统的性能。本文将详细探讨Java中的内存池和对象池管理,包括池化技术的概念、常见实现方法(如Apache Commons Pool、C3P0等),以及如何通过池化技术优化性能、减少GC压力,提升系统稳定性。

喵手的博客 914

神奇!自己 new 出来的对象一样也可以被 Spring 容器管理!

按理说自己 new 出来的对象和容器是没有关系的,但是在 Spring Security 框架中也 new 了很多对象出来,一样也可以被容器管理,那么它是怎么做到的? 今天来和大家聊一个略微冷门的话题,Spring Security 中的 ObjectPostProcessor 到底是干嘛用的? 本文是 Spring Security 系列第 32 篇,阅读前面文章有助于更好的理解本文: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密码怎么

江南一点雨的专栏 3898

Claude Code 完整使用教程(2026最新版)

《Claude Code 完整使用教程(2026最新版)》摘要: Claude Code 是 Anthropic 公司推出的智能编程工具,通过自然语言对话实现代码编写、调试和重构。本教程基于 v2.1.101 版本,涵盖安装配置、核心功能及最新特性。主要内容包括: 多平台安装方式(macOS/Linux/Windows) 桌面应用专属功能如并行会话、定时任务和语音模式 模型选择指南(Sonnet/Opus/Haiku) 快速入门示例:5分钟创建Node.js项目 核心功能:代码读写、命令执行、Git集成等

程序猿_三产 2万+

PYTHON面向对象之学生管理系统!

python面向对象之学生管理系统 话不多说,先看看代码(求关注+赞,努力写出好的东西!…_ 谢谢!!) #哪里有所不妥可以修改 #python面向对象之学生管理系统 import sys class StudentManage: student_list = [] #添加学生信息 def rank_score(self): b = int(input('降序还是逆序?')) self.student_list.sort(key = lambda x:int(x[5]),reverse =

dong_i 欢迎大家! 2271

《第二十二篇》Cross-Attention:注意力机制详解-代码实现和公式详解《二》

本文详细介绍了Cross-Attention的原理、公式和实现。Cross-Attention用于Transformer解码器和Encoder-Decoder结构,通过查询向量(Q)与键、值向量(K、V)的交互实现序列对齐。核心公式为softmax(QK^T/√d_k)V,其中Q来自Decoder,K、V来自Encoder。文章还给出了多头注意力机制公式和PyTorch实现代码,包括投影计算、注意力分数计算和输出处理。代码示例展示了如何构建一个完整的Cross-Attention模块,并演示了其在解码器查询

guoguozgw的博客 2214

Unity3D安装:离线安装 Unity

Unity 下载助手 (Download Assistant) 支持离线部署。在这种部署方式中,可下载用于安装 Unity 的所有文件,然后生成脚本以便在未接入互联网的其他计算机上重复相同的安装。运行下载助手,并在一台计算机上正常安装 Unity。此计算机必须有足够的可用磁盘空间来下载所有文件。单击下拉选单并选择 __Custom__,然后选择要将文件下载到的位置。打开 PC 的文件管理器,导航到之前指定的自定义位置文件夹,然后在该文件夹内查找。整理翻译,转载请注明出处!

ygtu2018的博客 3259

使用ACL,轻松管理对存储桶和对象的访问!

访问控制与权限管理是腾讯云对象存储 COS 最实用的功能之一,经过开发者的总结沉淀,已积累了非常多的最佳实践。读完本篇,您将了解到如何通过ACL,对存储桶和对象进行访问权限设置。什么是A...

云存储小天使的博客 1461

【EtherCAT实践篇一】TwinCAT 3安装、使用

FULL(XAE)安装包:包含了XAR的功能,并能进行多种语言的编程和硬件组态,通常安装在编程电脑上;XAR安装包:包含了ADS的功能,是实时运行环境,对 TwinCAT 模块进行加载、执行、管理、实时运行与调用,通常安装在PLC中;RM安装包:在装了高版本的TwinCAT 3后,发现PLC中的TwinCAT版本较低,就需要安装相应低版本的RM安装包切换版本使用(注:4024无法使用RM安装包切换到低于4022的版本,如4020/4018/4016版本。

JXES智能生态系统 5133

管理员操作组策略对象时常见错误!

一般来说,管理员通常不会备份组策略对象,这就是一个常见错误,因为一旦遇到突发事件,会很难及时恢复。 而为什么管理员会忽略这个小问题? 因为微软本身提供了组策略对象备份与恢复功能,但十分有限。 因此所有管理员在操作组策略对象时可以借鉴以下操作: 1.每天备份所有组策略对象。 2.制定组策略对象操作报表。 3.实时设置组策略对象恢复方案。 作为管理员,您可以使用微软VB语言提供的组...

weixin_40188275的博客 279

陀螺仪选型避坑指南:为什么IMU660RA是智能车竞赛的性价比之选?

本文针对智能车竞赛场景,提供陀螺仪选型避坑指南,并深度解析为何IMU660RA成为性价比之选。文章指出,竞赛选型应避免盲目追求高性能“黑盒”模块,而应注重原始数据获取与算法开发。IMU660RA以其良好的常温稳定性、适中的噪声水平、极致的性价比和丰富的生态支持,成为帮助参赛者深入理解姿态解算原理、进行“白盒开发”的理想教学与实践平台。

tech5的博客 883

企业级AI平台架构设计:AI应用架构师的未来趋势

企业级AI平台是AI从“实验室”走向“生产线”的关键,而AI应用架构师就是这条“生产线”的总设计师。未来,随着生成式AI、边缘计算、自治式AI的发展,架构师的角色将越来越重要——他们不仅要构建技术平台,还要连接技术与业务,让AI真正创造价值。“不要做‘只会调模型的工程师’,要做‘能解决业务问题的架构师’。因为,真正有价值的AI,从来不是“最先进的模型”,而是“能落地、能复用、能创造业务价值的平台”。愿你在企业AI转型的浪潮中,成为那个“搭建桥梁的人”——连接技术与业务,连接现在与未来。

小程序开发 973

面向对象基础案例之客户管理小程序!

目录 引言 一、案例需求 二、思路 三、代码实现。 源码再此 customer类 工具类 测试类 引言 各位小伙伴们,今天给大家分享一个经典初学者案例,希望对你有所帮助。 创作不易,求个免费的三连支持一下呀! 一、案例需求 l 模拟实现一个基于文本界面的《客户信息管理软件》 l 进一步掌握编程技巧和调试技巧,熟悉面向对象编程 l 主要涉及以下知识点: Ø类结构的使用:属性、方法及构造器 Ø对象的创建与使用 Ø类的封装性...

秋雨绵绵 921

华为昇腾开发——多模型资源管理(C++)

在使用Ascend ACL(Ascend Computing Language)的ACLLite库进行多模型推理时,合理的资源管理至关重要。

如果想成为中心,那么就到中心去吧。 577

java对象内存管理的简单认识!

java里面有句名言:Everything is object!但是java还算不上是纯面向对象的语言。它的数据类型包括基本数据类型(byte,short,int,char,long ,float,double,boolean)和引用类型(数组,类对象等)。 java语言是C++的儿子。java升级了C++中对于对象的理解,除去了C,C++中难以理解的指针使用,让编程人员更加舒适的表达自己的程序...

Super小龙的博客 717

R 语言 ggplot2 绘制精美高级全球地图

在本教程中,我们将学习如何使用R语言和ggplot2包绘制精美高级地图。ggplot2是一个功能强大的数据可视化包,它可以让我们创建漂亮、交互式的地图。我们将使用R中的一些其他包来处理地理空间数据,以便与ggplot2无缝协作。

Mrrunsen的博客 1867

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python 删除对象内存_看过来啦!教你用Python进行内存管理

原标题:看过来啦!教你用Python进行内存管理现在学Python的小伙伴有很多啦!Python语言的发展前景也是有目共睹。小助手今天为大家带来了Python中内存管理的方法,一起来学习一下吧~ Python中的内存管理是从三个方面来进行的,一对象的引用计数机制,二垃圾回收机制,三内存池机制一、对象的引用计数机制Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。引用计数增...

weixin_39569076的博客 329

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

别再为存储发愁了!MinIO开源对象存储搭建实战,让你的数据管理飞起来

本文分享了MinIO开源对象存储的搭建与使用经验。介绍了MinIO的优势(低成本、高安全性、兼容S3 API),详细说明了在Debian系统下的单机版安装步骤,包括环境准备、用户创建、服务配置和systemd集成。演示了Web管理界面的基本操作和访问策略设置,并提供了Python SDK调用示例。最后讨论了集群部署的考虑因素和性能优化建议(SSD存储、内存扩容等)。MinIO作为自建云存储方案,在功能、性能和迁移成本方面表现优异。

qq_31815769的博客 2856

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java面向对象——图书管理系统(小白也能看的懂!)

面向对象,代码详情,简单易懂

m0_61761695的博客 2440

Python详细解析del语句,对象删除与内存管理轻松无忧!

deldel语句是Python中用于删除对象、变量、属性和元素的重要工具。了解如何在不同情况下使用del语句,并理解其与可变对象的交互,有助于更有效地管理资源和数据。希望本文的内容帮助大家更好地理解和应用del语句。更多Python学习内容:ipengtao.com干货笔记整理100个爬虫常见问题.pdf ,太全了!Python 自动化运维 100个常见问题.pdfPython Web 开发常见的100个问题.pdf124个Python案例,完整源代码!PYTHON 3.10中文版官方文档。

涛哥聊Python 4003

6大核心功能!MinIO Console让对象存储管理效率提升300%

MinIO Console是一款为MinIO对象存储打造的交互式Web管理工具,通过直观的图形界面让用户无需命令行即可完成数据存取、桶管理、权限配置等核心操作,兼容Windows、macOS和Linux系统,是提升云存储管理效率的必备工具。 ## 项目概述:重新定义对象存储管理体验 在传统对象存储管理中,命令行操作不仅门槛高,还容易因参数错误导致数据风险。MinIO Console通过可视化界

gitblog_00766的博客 1071

告别命令行!MinIO Console图形化管理工具让你轻松掌控对象存储

还在为复杂的MinIO命令行操作而头疼吗?面对存储桶创建、权限配置、文件管理等任务,是不是觉得学习成本太高?MinIO Console图形化管理工具正是为你量身打造的解决方案,让对象存储管理变得像使用Windows资源管理器一样简单直观。 ## 从零开始:快速搭建你的图形化管理环境 ### 第一步:获取MinIO Console源码 首先需要从官方仓库获取MinIO Console的源代码:

gitblog_00774的博客 766

spring security 密码加盐_神奇!自己 new 出来的对象一样也可以被 Spring 容器管理!...

松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程按理说自己 new 出来的对象和容器是没有关系的,但是在 Spring Security 框架中也 new 了很多对象出来,一样也可以被容器管理,那么它是怎么做到的?今天来和大家聊一个略微冷门的话题,Spring Security 中的 ObjectPost...

weixin_39710462的博客 234

nt!WMIInitialize函数分析之WMIAdminDevice和WMIDataDevice设备对象的建立

nt!WMIInitialize函数分析之WMIAdminDevice和WMIDataDevice设备对象的建立

linux-0.11调试教程 278
上一篇: EJB学习笔记(1)
下一篇: Blief
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值