逆向学习 SDK 篇:通过封装来简化代码编写,提高代码复用性

本节课在线学习视频(网盘地址,保存后即可免费观看):

​​https://pan.quark.cn/s/83dbb1700946​​

在软件开发中,封装是面向对象编程的重要特性之一。通过封装,我们可以将复杂的实现细节隐藏起来,对外提供简洁的接口,从而简化代码编写,提高代码的复用性和可维护性。本文将详细介绍通过封装来简化代码编写的技术方法,并通过多个代码案例展示如何实现高效的代码复用。

1. 什么是封装

封装是一种将数据和操作数据的方法绑定在一起,并隐藏对象的内部实现细节的技术。通过封装,类的内部实现对外部是不可见的,只有类提供的公共接口可以访问。

2. 为什么需要封装

封装的主要优点包括:

  • 提高代码可读性:通过封装,复杂的实现细节被隐藏起来,对外提供简洁明了的接口,使代码更容易理解。
  • 提高代码复用性:通过封装,通用的功能可以被抽象成类或方法,从而在多个地方复用,减少代码冗余。
  • 提高代码可维护性:封装使得代码模块化,各模块独立开发、测试和维护,降低了修改代码时引入错误的风险。

3. 封装的基本方法

封装的基本方法包括:

  • 将数据成员封装为私有:通过将类的数据成员声明为私有(​​private​​)来隐藏内部数据。
  • 提供公共访问方法:通过提供公共的访问方法(例如 ​​getters​​​ 和 ​​setters​​)来访问和修改私有数据。
  • 抽象公共功能:将通用的功能抽象成独立的方法或类,以提高代码的复用性。

4. 代码案例

案例1:封装数据库连接

数据库操作是一个常见的任务,通过封装数据库连接和操作,可以简化代码编写。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DatabaseHelper {
    private String url;
    private String user;
    private String password;

    public DatabaseHelper(String url, String user, String password) {
        this.url = url;
        this.user = user;
        this.password = password;
    }

    private Connection connect() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }

    public ResultSet executeQuery(String query) throws SQLException {
        Connection conn = connect();
        PreparedStatement stmt = conn.prepareStatement(query);
        return stmt.executeQuery();
    }

    public int executeUpdate(String query) throws SQLException {
        Connection conn = connect();
        PreparedStatement stmt = conn.prepareStatement(query);
        return stmt.executeUpdate();
    }

    // 关闭连接
    public void closeConnection(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        DatabaseHelper dbHelper = new DatabaseHelper("jdbc:mysql://localhost:3306/testdb", "user", "password");
        try {
            ResultSet rs = dbHelper.executeQuery("SELECT * FROM users");
            while (rs.next()) {
                System.out.println("User: " + rs.getString("username"));
            }

            int rowsAffected = dbHelper.executeUpdate("UPDATE users SET password = 'newpassword' WHERE username = 'john'");
            System.out.println("Rows affected: " + rowsAffected);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们通过封装数据库连接和操作,简化了数据库访问的代码,使其更加简洁和易于复用。

案例2:封装网络请求

网络请求是另一个常见的任务,通过封装网络请求,可以提高代码复用性。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpHelper {
    private static final String USER_AGENT = "Mozilla/5.0";

    public static String sendGet(String url) throws Exception {
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestMethod("GET");
        con.setRequestProperty("User-Agent", USER_AGENT);

        int responseCode = con.getResponseCode();
        System.out.println("GET Response Code :: " + responseCode);

        if (responseCode == HttpURLConnection.HTTP_OK) {
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            return response.toString();
        } else {
            return "GET request not worked";
        }
    }

    public static String sendPost(String url, String urlParameters) throws Exception {
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setDoOutput(true);

        con.getOutputStream().write(urlParameters.getBytes());

        int responseCode = con.getResponseCode();
        System.out.println("POST Response Code :: " + responseCode);

        if (responseCode == HttpURLConnection.HTTP_OK) {
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            return response.toString();
        } else {
            return "POST request not worked";
        }
    }

    public static void main(String[] args) {
        try {
            String url = "https://jsonplaceholder.typicode.com/posts";
            String response = HttpHelper.sendGet(url);
            System.out.println("GET Response: " + response);

            String urlParameters = "userId=1&title=foo&body=bar";
            response = HttpHelper.sendPost(url, urlParameters);
            System.out.println("POST Response: " + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们通过封装GET和POST请求,使得网络请求的代码更加简洁和易于复用。

案例3:封装日志记录

日志记录是另一个常见的任务,通过封装日志记录,可以提高代码复用性和可维护性。

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Logger {
    private String logFile;

    public Logger(String logFile) {
        this.logFile = logFile;
    }

    public void log(String message) {
        try (PrintWriter out = new PrintWriter(new FileWriter(logFile, true))) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String timestamp = sdf.format(new Date());
            out.println(timestamp + " - " + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Logger logger = new Logger("app.log");
        logger.log("Application started");
        logger.log("An example log message");
        logger.log("Application ended");
    }
}

在这个例子中,我们通过封装日志记录功能,使得日志记录的代码更加简洁和易于复用。

5. 注意事项

  • 保持接口简洁:封装的目的是简化使用,因此在设计接口时应尽量保持简洁明了。
  • 避免过度封装:过度封装可能导致代码复杂化,应根据实际情况合理封装。
  • 提供完整的功能:封装的类或方法应提供完整的功能,以满足实际使用需求。

结语

通过封装,我们可以将复杂的实现细节隐藏起来,对外提供简洁的接口,从而简化代码编写,提高代码的复用性和可维护性。本文通过多个代码案例展示了如何通过封装来实现数据库连接、网络请求和日志记录等常见任务的简化和复用。希望这些示例和注意事项能帮助你更好地理解和应用封装技术,提高代码质量和开发效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电商秒杀系统

一,细节 二,需要注意的细节 1.库存超卖问题 使用mysql数据库的 悲观锁 机制。在事务中使用 for update 语句,此时数据库会加锁,其他想要当前读的线程都会被阻塞,在事务处理完成之后释放这一条数据。该方法的缺点在于…

基于springboot实现入校申报审批系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现入校申报审批系统演示 摘要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装入校申报审批系统软…

英伟达开源最强通用模型Nemotron-4 340B

英伟达的通用大模型 Nemotron,开源了最新的 3400 亿参数版本。 本周五,英伟达宣布推出 Nemotron-4 340B。它包含一系列开放模型,开发人员可以使用这些模型生成合成数据,用于训练大语言模型(LLM)&#xff0…

排序——希尔排序

希尔排序实际上是插入排序的优化,所以要先介绍插入排序。 目录 插入排序 思想 演示 代码实现 总结 希尔排序 思想 演示 代码 总结 插入排序 思想 又称直接插入排序。它的基本思想是将一个值插入到一个有序序列中。直至将所有的值都插入完。 演示 假设数…

Web爬虫--fofa-资产信息搜集

免责声明:本文仅做技术交流与学习... 目录 fofa.py fofa搜索参数分析 fofa_api.py fofa.py import requests from bs4 import BeautifulSoup# 登录fofa之后,把自己的cookie弄过来. header{cookie: } # 参数为搜索的语法. urlhttps://fofa.info/result?qbase64dGl0bGU9IuS4…

云计算【第一阶段(14)】Linux的目录和结构

一、Liunx目录结构 1.1、linux目录结构 linux目录结构是树形目录结构 根目录(树根) 所有分区,目录,文件等的位置起点整个树形目录结构中,使用独立的一个"/",表示 1.2、常见的子目录 必须知道 目录路径目…

xinput1_3.dll怎么安装,关于xinput1_3.dll的多种修复方法分享

在电脑使用过程中,我们可能会遇到一些错误提示,其中之一就是“找不到xinput1_3.dll”。那么,xinput13.dll到底是什么?为什么会出现找不到的情况?它对电脑有什么影响?本文将为您详细解析xinput1_3.dll的含义…

CPN Tools学习——从平面网构建分层 PN

1.先创建平面petri网 创建如下petri网: CPN ide创建petri网真的舒服很多,但是教程又是CPN Tools的,我的想法是看两个版本能不能互通,在前者创建,在后者运行学习。 新增定义: colset E unit with e; 但…

嘻嘻我是图床倒霉蛋

嘻嘻花了将近两个小时的时间配了一个小小的图床 手把手教你搭建阿里云图床(PicGoTypora阿里云OSS),新手小白一看就会-阿里云开发者社区 (aliyun.com) 大体上按照这篇配置就好 七牛云因为测试域名30天到期,用自己的得备案,所以比较麻烦,建议直接上阿里云 我买了一…

JDBC常见的几种连接池使用(C3P0、Druid、HikariCP 、DBCP)

前言 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。连接池技术尽可能多地重用了消耗内存的资源,大大节省了内存。通过使用连接池,将大大提高程序运行效率。常用的…

数字孪生技术如何赋能智慧工厂

数字孪生技术为什么能在智慧工厂中发挥作用?随着工业4.0的推进和智能制造的普及,数字孪生技术成为智慧工厂的重要推动力。数字孪生是指在虚拟空间中创建一个与现实物理实体相对应的数字模型,通过实时数据交互和分析,实现对物理实体…

DAY24 回溯算法part01 77. 组合 216.组合总和III 17.电话号码的字母组合

理论基础 #什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯 (opens new window)。 回溯是递…

Excel自定义排序和求和

概览 excel作为办公的常备工具,好记性不如烂笔头,在此梳理记录下,此篇文章主要是记录excel的自定义排序和求和 一. 自定义排序 举个例子 1. 填充自定义排序选项 实现步骤: 选定目标排序值;文件->选项->自定…

从0开始理解DevOps

目录 一、DevOps背景 二、DevOps介绍 DevOps 组成 三、Jenkins Jenkins 工作流程 四、云原生与DevOps 相信你一定听过 DevOps 这个词,那它到底是什么呢?为什么越来越多的互联网企业都在追随使用它?它与云原生有什么关系?本文将…

checkbox表单校验 至少选中一个Checkbox , 否则会报错

项目背景 : react ant 需求 : 需实现至少选中一个Checkbox , 否则会报错 需求如下 : 注意 : Input, Select, DatePicker可以直接处理Form.Item的验证规则 , 但Checkbox不行 , 需自定义验证规则 实现 : // 自定义的checkbox校验规则--星期const validateAtLeastOneCheckbo…

面试题 17.07. 婴儿名字

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; class Solution { public:vector<string> trulyMostPopular(vector<string>& names, vector<string>& synonyms) {UnionFind uf;for (auto& syn : synonyms) {//c…

【计算机毕业设计】241外卖微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【探索Linux】P.34(HTTPS协议)

阅读导航 引言一、HTTPS是什么1. 什么是"加密"2. 为什么要加密3. 常见的加密方式&#xff08;1&#xff09;对称加密&#xff08;2&#xff09;非对称加密 二、证书认证1. CA认证 三、HTTPS的加密底层原理✅非对称加密对称加密证书认证 温馨提示 引言 在上一篇文章中…

@EqualsAndHashCode(callSuper = false和ture)的区别

EqualsAndHashCode&#xff08;callSuper false和ture&#xff09;的区别 区别 如果值是true&#xff0c;那么会比较父类的字段值&#xff0c;只有两个对象的父类字段也相同的时候&#xff0c;两个对象的比较结果才会是true&#xff1b;如果值是fasle&#xff0c;那么既便两个…

Weevil-Optimizer象鼻虫优化算法的matlab仿真实现

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 Weevil-Optimizer象鼻虫优化算法的matlab仿真实现&#xff0c;仿真输出算法的优化收敛曲线&#xff0c;对比不同的适应度函数。 2.测试软件版本以及运行结果展示…