日期: 2021 年 4 月 7 日

金融量化分析基础环境搭建

金融量化分析基础环境搭建

金融量化分析基础环境搭建
*步:Python安装
anaconda官网下载
下载地址
https://www.anaconda.com/distribution/
注意选用该电脑相应的系统和64/32位。

已安装Python使用环境的请跳过此步骤。

第二步:Backtrader安装
Backtrader功能十分完善,有完整的使用文档,安装相对简单(直接pip安装即可)。优点是运行速度快,内置了talib股票分析技术指标库;支持多品种、多策略、多周期的回测和交易;扩展灵活,可以集成TensorFlow、PyTorch和Keras等机器学习、神经网络分析模块。

backtrader官方文档:

https://www.backtrader.com/docu/

安装方法:

pip install backtrader

第三步:Tushare安装
Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据。

Tushare*新版数据更加稳定,需注册后获取token使用,注册地址:https://tushare.pro/register?reg=434267 (请尽量使用该链接)

注册完成后,点击个人头像,会在如下图所示的位置找到token。

%title插图%num

安装方法:

pip install tushare

基本使用方式:

import tushare as ts
ts.set_token(‘上图中的token’)
pro = ts.pro_api()

#1、日线
df = pro.daily(ts_code=’000001.SZ’, start_date=’20180701′, end_date=’20180718′)
print(df)
7

ython 中发送邮件

ython 中发送邮件

Python 中使用163发送邮件
链接: 163邮箱
从图片中可以看到,我们能获取到邮箱授权码
图片:

%title插图%num
# coding:utf-8 #强制使用utf-8编码格式
import smtplib # 加载smtplib模块
from email.mime.text import MIMEText
from email.utils import formataddr

my_sender = ‘xxxn@163.com’ # 发件人邮箱账号,为了后面易于维护,所以写成了变量
my_user = ‘xxx@qq.com’ # 收件人邮箱账号,为了后面易于维护,所以写成了变量

def email():
ret = True
try:
# 三个参数:*个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
msg = MIMEText(‘<h1><a href=”http://www.baidu.com”>这是一个链接</a></h1>’, ‘html’, ‘utf-8’)
msg[‘From’] = formataddr([“xxx”, my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg[‘To’] = formataddr([“xxx”, my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg[‘Subject’] = “一个邮件” # 邮件的主题,也可以说是标题

server = smtplib.SMTP(“smtp.163.com”, 25) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, “xxx”) # 括号中对应的是发件人邮箱账号、邮箱授权码
# 可以一次给多人发送邮件
server.sendmail(my_sender, [my_user, ‘xxx@qq.com’], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 这句是关闭连接的意思
except Exception: # 如果try中的语句没有执行,则会执行下面的ret=False
ret = False
return ret

if __name__ == ‘__main__’:
ret = email()
if ret:
print(“邮件发送成功”) # 如果发送成功则会返回ok,稍等20秒左右就可以收到邮件
else:
print(“邮件发送失败”) # 如果发送失败则会返回filed

frps搭建自己的内网穿透服务器

服务器搭建
服务器是阿里云ECS CenterOS CentOS 7.4 64位
下载frps服务器
选择frp_0.21.0_linux_amd64.tar.gz,如果你是其他操作系统,请自行选择
下载完之后,传到ECS上,然后解压,编辑frps.ini配置文件
[common]
# 服务器端端口
bind_port = 7000
# 客户端连接凭证
privilege_token = fxl421125
# *大连接数
max_pool_count = 5
# 客户端映射的端口
vhost_http_port = 80
# 服务器看板的访问端口
dashboard_port = 7500
# 服务器看板账户
dashboard_user = admin
dashboard_pwd = fxl123

设置完以上配置,保存退出,然后启动服务器
注意vhost_http_port是代理之后http访问的端口,如果有人服务器端还装了nginx,并且nginx是80端口,那么这里就配置其他端口,然后用nginx进行代理转发即可

./frps -c ./frps.ini

启动之后查看日志, 提示Start frps success基本上就启动成功

2018/09/04 11:02:49 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000
2018/09/04 11:02:49 [I] [service.go:172] http service listen on 0.0.0.0:8080
2018/09/04 11:02:49 [I] [root.go:207] Start frps success

客户端搭建
客户端是通常是windows
下载frps客户端
选择frp_0.21.0_windows_amd64.zip 64位文件
然后解压,配置frpc.ini文件,配置如下:

[common]
# 服务器地址
server_addr = 59.110.161.180
# 服务器端口
server_port = 7000
# 服务器连接凭证
privilege_token = fxl123

[web]
privilege_mode = true
remote_port = 6000
type = http
local_ip = 127.0.0.1
# 本地映射的端口
local_port = 80
use_gzip = true
# 绑定域名 域名需要配置好解析,解析到服务器
custom_domains = manager.fanxl.cn

命令行启动客户端

frpc.exe -c frpc.ini
F:\Program Files\frp_0.21.0_windows_amd64>frpc.exe -c frpc.ini
2018/09/04 11:39:09 [I] [proxy_manager.go:300] proxy removed: []
2018/09/04 11:39:09 [I] [proxy_manager.go:310] proxy added: [web]
2018/09/04 11:39:09 [I] [proxy_manager.go:333] visitor removed: []
2018/09/04 11:39:09 [I] [proxy_manager.go:342] visitor added: []
2018/09/04 11:39:09 [I] [control.go:246] [883f61e2422ed3f3] login to server success, get run id [883f61e2422ed3f3], server udp port [0]
2018/09/04 11:39:09 [I] [control.go:169] [883f61e2422ed3f3] [web] start proxy success

看到如下信息 start proxy success 说明连接成功,此时可以通过7500端口访问服务器的控制面板页面,查看连接情况
客户端可以新建一个start.bat文件,把启动命令放在里面,这样每次直接运行bat文件即可

如果客户端有多个端口需要穿透

[common]
# 服务器地址
server_addr = 59.110.161.180
# 服务器端口
server_port = 7000
# 服务器连接凭证
privilege_token = fxl123

[web8080]
remote_port = 6001
type = tcp
local_ip = 127.0.0.1
local_port = 8080

[web8081]
remote_port = 6002
type = tcp
local_ip = 127.0.0.1
local_port = 8081

然后通过服务器ip:6001和ip:6002进行访问,同样如果想去掉端口,可以通过服务器nginx做一次代理。

服务器服务后台运行及自动启动
使用systemd配置开机自启,适用于 centos7 Ubuntu 16 或 debian 8。

vi /etc/systemd/system/frps.service 新建此文件,并写入以下内容:

[Unit]

Description=frps daemon

After=syslog.target network.target

Wants=network.target

[Service]

Type=simple

ExecStart=/home/developer/frp_0.21.0_linux_amd64/frps -c /home/developer/frp_0.21.0_linux_amd64/frps.ini

Restart= always

RestartSec=1min

[Install]

WantedBy=multi-user.target

启动并设为开机自启。

systemctl start frps //启动

systemctl status frps //状态查询

systemctl enable frps //开机启动

补充一下:

ExecStart=/home/developer/frp_0.21.0_linux_amd64/frps.ini

ExecStart=后面这个是frps文件和配置文件<frps_my.ini>所在的目录,根据自己的文件位置修改

python线程和线程池基础

python线程和线程池基础

仅作为笔记使用

线程:

import threading
import time
import random

def task_thread(counter):
sum = random.randint(1,10)
time.sleep(sum)
print(str(sum)+f’—-线程名称:{threading.current_thread().name} 参数:{counter} 开始时间:{time.strftime(“%Y-%m-%d %H:%M:%S”)}’)

#开1000个线程运行task_thread函数,将i作为参数传递给task_thread函数
for i in range(1000):
print(‘线程-1-‘+str(i))
t = threading.Thread(target=task_thread,args=(i,))
t.start()
print(‘线程-2-‘+str(i))
线程池

import time
from concurrent.futures.thread import ThreadPoolExecutor

def task_thread(id):
time.sleep(1)
print(id)
data=[1,2,3,4,5,6,7,8,9]
# 创建一个包含3个线程的线程池
thread_pool = ThreadPoolExecutor(max_workers=3)
#以map的方式提交线程,map可以提交数组数据
thread_pool.map(task_thread,data)

#2.以submit方式提交线程,submit只能提交单个的数据
# for i in data:
# print(i)
# thread_pool.submit(task_thread,i)
线程锁

import threading

mutex = threading.Lock()#执行函数之前添加线程锁

mutex.release()#函数执行后释放线程锁

使用R和Python操作大型数据文件

使用R和Python操作大型数据文件

*近有些大型数据文件,每个大概500万行,用R read.delim或read.csv函数大概一个要读10分钟,于是在网上搜索快速解决方案,整理如下

1. 读取大型文件
工具:R data.table软件包
函数:fread()

> library(data.table)
> dt1 <- fread(“test.txt”, sep = “\t”,header = FALSE, na.strings = “NA”)

实测,500万行,13列,64Gb Linux系统中,读取大概10 s。

用完我骂人了,骂我自己无知,有知识,真好~

(对这个包感兴趣的可以搜索一下,frank、fread之类的函数命名方式真的很皮~)

对多个文件,简单循环一下:

library(dplyr)
library(data.table)
#读取目录里的.txt文件
a = list.files(pattern = “.txt”)
#读取*个文件
ad1<-fread(a[1],header=T)
#根据条件筛选数据
ad1<-filter(ad1,p_value<=1E-8)
#提取文件名字
ss<-basename(a[1])
ss<-gsub(‘.txt’,”,ss)
#将文件名作为注释,添加到新的一列
ad1<-mutate(assoc.data,NAME=rep(ss,length(ad1[,1])))

#对其他文件循环,将筛选的数据循环加到ad1中保存,并在*后一列注释中,区分数据来自哪个文件
for (i in 2:length(a)){
new.data = fread(a[i],header=T)
new.data<-filter(new.data,p_value<=1E-8)
ss<-basename(a[i])
ss<-gsub(‘.txt’,”,ss)
new.data<-mutate(new.data,NAME=rep(ss,length(new.data[,1])))

ad1 = rbind(ad1,new.data)
}
#将合并的文件保存
fwrite(ad1,”longlist.csv”)

2. 将大型Excel文件切割成小文件
工具:Python pandas、numpy 模块
函数:read_excel

import pandas as pd
import numpy as np

i=0
for df in pd.read_excel(file_name, chunksize=50000):
df.to_excel(‘/path/to/file_{:02d}.xlsx’.format(i), index=False)
i += 1

这里chunksize是指,分割后的文件,每个包含的行数。

或者

chunksize = 50000
df = pd.read_excel(file_name)
for chunk in np.split(df, len(df) // chunksize):
chunk.to_excel(‘/path/to/file_{:02d}.xlsx’.format(i), index=False)

(以上内容来自:https://stackoverflow.com/questions/41321082/pandas-split-large-excel-file)

或者

import numpy as np
np.array_split(df, 10)
#将df分为10等份

python确实更灵活些,有时间一定要多学学,可惜目前所需的一些分析方法只能在R里做。

tkinter禁止关闭窗口

tkinter禁止关闭窗口

 

from tkinter import *
import tkinter.messagebox as messagebox

class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()

def createWidgets(self):
self.tiplabel = Label(self, text=’输入“我是帅哥”,退出该程序’)
self.tiplabel.pack()
self.valueInput = Entry(self)
self.valueInput.pack()
self.alertButton = Button(self, text=’验证’, command=self.proof)
self.alertButton.pack()

def proof(self):
keyvalue = self.valueInput.get()

if keyvalue == ‘我是帅哥’:
messagebox.showinfo(‘提示’, ‘你的自我认知很对’)
root.destroy()
else:
messagebox.showerror(‘错误’, ‘我觉得你可以考虑一下’)

def callback():
messagebox.showwarning(‘警告’,’回答问题’)

root = Tk()
root.geometry(‘300×150’)
app = Application().pack()
root.protocol(“WM_DELETE_WINDOW”, callback)
root.mainloop()

import tkinter as tk
from tkinter import messagebox

root = tk.Tk()

def on_closing():
if messagebox.askokcancel(“Quit”, “Do you want to quit?”):
root.destroy()

root.protocol(“WM_DELETE_WINDOW”, on_closing)
root.mainloop()

numpy常见操作

numpy常见操作

【1】数组创建及填充
import numpy as np

#[1]————————————————————
# 生成一个数组
#range生成
array1=np.arange(10,20,2)
print(array1)

#linspace生成
array2=np.linspace(10,20,20)
print(array2)
print(type(array1))

#[2]————————————————————
# 0数组和1数组以及其他数组
array3=np.zeros((3,4),dtype=int)
print(array3)

array4=np.ones((5,4),dtype=int)
print(array4)

#0填充
array31=np.zeros_like(array4,dtype=int)
print(array31)

#1填充
array41=np.ones_like(array3,dtype=int)
print(array41)

#任意数值填充
array5=np.full_like(array41,10)
print(array5)

#[3]N维数组属性————————————————————
array6=np.arange(1,21).reshape(4,5)
print(array6)
#显示维度
print(array6.ndim)
#显示形状
print(array6.shape)
#显示大小
print(array6.size)
【2】数组、矩阵的基本运算
import numpy as np

#[1]数组的基本运算————————————————————
array1=np.arange(1,11,1).reshape(2,5)
print(array1)

array2=np.arange(1,11,1).reshape(2,5)
array3=np.full_like(array2,2)
print(array3)

#基本运算,元素度元素
array4=array1+array3
print(array4,”\n”)

array5=array1-array3
print(array5,”\n”)

array6=array1*array3
print(array6,”\n”)

array7=array1/array3
print(array7,”\n”)

#[2]点乘运算————————————————————
#2.1 dot()函数运算
array8=np.arange(1,21,1).reshape(4,5)
print(array8,”\n”)

array9=np.arange(1,21,1).reshape(5,4)
print(array9,”\n”)

array10=np.dot(array8,array9)
print(array10,”\n”)

#2.2 转换为mat矩阵在进行运算
array81=np.mat(array8)
print(array81,”\n”)

array91=np.mat(array9)
print(array91,”\n”)

array11=array91*array81
print(array11,”\n”)

”’
einsum()并不是一个简单的求和运算方法,而是一个高效的符号计算规则,
它可实现矩阵的各种求和操作(如点乘、转置、矩阵求迹等),被称为NumPy的“暗宝”
”’
#[3]einsum()运算————————————————————

#3.1一维数组求和
print(“-“*40)
a=np.arange(1,11)
b=np.einsum(‘i->’,a)
print(b)

#3.2二维数组求和
print(“-“*40)
a1=np.arange(1,21).reshape(4,5)
print(a1)
b1=np.einsum(‘ij->i’,a1)
c1=np.einsum(‘ij->j’,a1)
print(b1)
print(c1)

#3.3矩阵乘法
print(“-“*40)
a3=np.arange(1,21).reshape(4,5)
b3=np.arange(1,21).reshape(5,4)
c3=np.einsum(‘ij,jk->ik’,a3,b3)
print(c3)

#3.4向量点集
print(“-“*40)
a4=np.arange(1,21).reshape(4,5)
b4=np.arange(1,21).reshape(5,4)
c4=np.einsum(‘ij,jk->’,a4,b4)
print(c4)

#3.5 取对角线元素
print(“-“*40)
a5=np.arange(1,17).reshape(4,4)
c5=np.einsum(‘ii->i’,a5)
print(c5)

#3.6 取对角线的迹
print(“-“*40)
a6=np.arange(1,17).reshape(4,4)
c6=np.einsum(‘ii->’,a6)
print(c6)

#3.7 矩阵转置
print(“-“*40)
a7=np.arange(1,16).reshape(3,5)
c7=np.einsum(‘ij->ji’,a7)
print(a7)
print(c7)
【3】*大值、*小值、均值、求和

import numpy as np

”’
np.reshape()作用是将原来的数组变换形状,不改变数组元素数量,要求更改后的数组元素总数不变。
np.resize()作用是改变数组的大小和形状,会改变数组元素数量,如果更改后的数组元素比原数组的多,
则用原数组中的元素充填补齐
”’
a=np.arange(1,13).reshape(3,4)
print(a)

b=np.sum(a,axis=0)
print(‘-‘*50)
print(b)

b=np.sum(a,axis=1)
print(‘-‘*50)
print(b)

b=np.mean(a,axis=0)
print(‘-‘*50)
print(b)

b=np.max(a,axis=0)
print(‘-‘*50)
print(b)

b=np.max(a,axis=(0,1))
print(‘-‘*50)
print(b)

【4】分割和拼接

import numpy as np

”’
堆叠方式大致分为水平方向堆叠(horizontal stack)、
垂直方向堆叠(vertical stack)、深度方向堆叠(depth-wise stack)等。
”’
#————————————-(1)堆叠————————————————
a=np.arange(1,13).reshape(3,4)
#水平方向堆叠
b=np.hstack((a,a))
print(b)
print(‘-‘*50)

#竖直方向堆叠
c=np.vstack((a,a))
print(c)
print(‘-‘*50)

#深度方向堆叠
d=np.arange(10,21)
e=np.arange(40,51)
f=np.arange(70,81)
g=np.dstack((d,e,f))
print(g)
print(‘-‘*50)

#二维列堆叠等价于水平方向堆叠
c1=np.arange(1,13).reshape(3,4)
c2=np.arange(21,33).reshape(3,4)
print(c1)
print(c2)
c3=np.column_stack((c1,c2))
print(c3)
print(‘-‘*50)

#二维行堆叠等价于竖直方向堆叠
c1=np.arange(1,13).reshape(3,4)
c2=np.arange(21,33).reshape(3,4)
print(c1)
print(c2)
c3=np.row_stack((c1,c2))
print(c3)
print(‘-‘*50)

#一维列堆叠
c1=np.arange(1,13)
c2=np.arange(21,33)
print(c1)
print(c2)
c3=np.column_stack((c1,c2))
print(c3)
print(‘-‘*50)

#一维行堆叠
c1=np.arange(1,13)
c2=np.arange(21,33)
print(c1)
print(c2)
c3=np.row_stack((c1,c2))
print(c3)
print(‘-‘*50)

#————————————-(2)分割————————————————
”’
NumPy也提供了数组的分割操作。和堆叠类似,分割也包括水平方向分割、
垂直方向分割和深度方向分割,分别用hsplit()、vsplit()和dsplit()实现。
类似于concatenate()方法可通过设置轴方向,既实现水平方向堆叠,又实现垂直方向堆叠,
split()也可以通过设置分割方向,分别实现hsplit()、vsplit()和dsplit()的功能。
”’

d1=np.arange(1,17).reshape(4,4)

#竖直方向分割
d2=np.vsplit(d1,2)
print(d2)
print(‘-‘*50)

#水平方向分割
d2=np.hsplit(d1,2)
print(d2)
print(‘-‘*50)

#水平按三列分割
d2=np.hsplit(d1,[1,2])
print(d2)
print(‘-‘*50)

#竖直按三行分割
d2=np.vsplit(d1,[1,2])
print(d2)
print(‘-‘*50)

【5】随机数

import numpy as np

#设置随机种子
rdm=np.random.RandomState(1)

#随机分布
r1=np.random.rand(2,3)
print(r1)
print(‘-‘*50)

#正太分布
r1=np.random.randn(2,3)
print(r1)
print(‘-‘*50)

#某个范围随机整数分布
r1=np.random.randint(1,10,(2,3))
print(r1)
print(‘-‘*50)

#某个范围随机数分布
r1=np.random.random((2,3))
print(r1)
print(‘-‘*50)

AndroidStudio下的APP目录结构介绍

Project Name:工程项目名称
Application Name:当前应用发布以后的名字,例如QQ图标下面的名字是“QQ”,就是Application Name.

Android Studio工程目录

%title插图%num

1、.gradle和.idea
这两个目录下放置的都是Android Studio自动生成的一些文件,我们无须关心,也不要去手动编辑。
2、app
项目中的代码、资源等内容几乎都是放置在这个目录下的,我们后面的开发工作也基本都是在这个目录下进行的,待会儿还会对这个目录单独展开进行讲解。
3、build
这个目录你也不需要过多关心,它主要包含了一些在编译时自动生成的文件。
4、gradle
这个目录下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle。Android Studio默认没有启动gradle wrapper的方式,如果需要打开,可以点击Android Studio导航栏 –> File –> Settings –> Build,Execution,Deployment –> Gradle,进行配置更改。
5、.gitignore
这个文件是用来将指定的目录或文件排除在版本控制之外的。
6、build.gradle
这是项目全局的gradle构建脚本,通常这个文件的内容是不需要修改的。下面回详细分析gradle构建脚本中的具体内容。
7、gradle.properties
这个文件是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。
8、gradlew和gradlew.bat
这两个文件是用来在命令行界面中执行gradle命令的,其中gradlew是在Linux或Mac系统中使用的,gradlew.bat是在Windows系统中使用的。
9、HelloWorld.iml
iml文件是所有IntelliJ IDEA项目都会自动生成的一个文件(Android Studio是基于IntelliJ IDEA开发的),用于标识这是一个IntelliJ IDEA项目,我们不需要修改这个文件中的任何内容。
10、local.properties
这个文件用于指定本机中的Android SDK路径,通常内容都是自动生成的,我们并不需要修改。除非你本机中的Android SDK位置发生了变化,那么就将这个文件中的路径改成新的位置即可。
11、settings.gradle
这个文件用于指定项目中所有引入的模块。由于HelloWorld项目中就只有一个app模块,因此该文件中也就只引入了app这一个模块。通常情况下模块的引入都是自动完成的,需要我们手动去修改这个文件的场景可能比较少。

app目录结构

除了app目录之外,大多数的文件和目录都是自动生成的不需要我们进行修改,下面我们详细介绍app目录结构。

%title插图%num

1、build
这个目录和外层的build目录类似,主要也是包含了一些在编译时自动生成的文件,不过它里面的内容会更多更杂,我们不需要过多关系。
2、libs
如果你的项目中使用到了第三方jar包,就需要把这些jar包都放在libs目录下,放在这个目录下的jar包都会被自动添加到构建路径里去。
3、src/AndroidTest
此处是用来编写Android Test测试用例的,可以对项目进行一些自动化测试。
4、src/main/java
毫无疑问,java目录是放置我们所有java代码的地方,展开该目录,你将看到我们刚才创建的HelloWorldActivity文件就在里面。
5、src/main/res
这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的所有图片,布局,字符串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下,所以你不用担心会把整个res目录弄得乱糟糟的。
6、main/AndroidManifest.xml
这是你整个Android项目的配置文件,你在程序中定义的所以四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明。
7、test
此处是用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
8、.gitignore
这个文件用于将app模块内的指定的目录或文件排除在版本控制之外,作用和外层的.gitignore文件类似。
9、app.iml
IntelliJ IDEA项目自动生成的文件,我们不需要关心或修改这个文件中的内容。
10、build.gradle
这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置。
11、proguard-rules.pro
这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码混淆,从而让破解者难以阅读。

项目中的资源

展开res目录看一下,其实里面的东西还是挺多的,很容易让人看得眼花缭乱,如下图:

%title插图%num

以drawable开头的文件夹都是用来放图片的;
以mipmap开头的文件夹都是用来放应用图标的;
以values开头的文件夹都是用来放字符串、样式、颜色等配置的;
layout文件夹是用来放布局文件的。

Android项目包名命名规范及常见项目架构

在Java中我们通常把具备相同或相似功能的一些类放在同一个包中,当然 不同公司会有不同的命名方式,但大体都相同,一个好的命名应见名知义,提高代码可读性,以利于后期代码的修改与维护。下面基于我自己做项目中的一些感触谈谈自己对包命名规范的理解。

一.Java包命名规范

1)包(packages): 采用反写域名命名规则,即com.xx.xxx.xxxx形式
     全部使用小写字母。一级包名为com,二级包名为xx(一般为公司或个人域名),三级包名根据应用进行命名,四级包名为功能模块名。如:com.tencent.qq.activitys,这样具备较高可读性,一看就知道是腾讯公司QQ软件中存放activity的包。
下面是一些常见的包命名组织方式。
com.example.app.activitys 用来组织Activity类
com.example.app.base 基础共享的类,如多个Activity共享的
BaseActivity或整个应用共享的MyApplication类
com.example.app.adapter 项目中用到的适配器类
com.example.app.view 自定义的View,如常用的TitleBarView
com.example.app.util 工具类,如HttpUtil,ImageUtil,FileUtil
com.example.app.db 数据库类,如DataBaseHelper,MessageDB
com.example.app.service 服务类,如GetMsgService
com.example.app.constant 常量类
com.example.app.domain/modle/entity 元素实体类,如对应注册用户信息的User类,
对应聊天信息的TextMessage类
com.example.app.broadcast 广播服务类

2)资源布局文件(XML文件(layout布局文件)):全部小写,采用下划线命名,我一般按照组件名_功能名_属性名方式

如:activity_login,fragment_constact_child.这样当你在Activity的onCreate中使用R.layout.的时候就只需筛选activity开头的xml文件,在Fragment的onCreateView中使用R.layout.的时候就只需筛选fragment开头的xml文件,这样就可以缩小聚焦范围,而且这样的命名具备较高的可读性,很容易知道fragment_constact_child表示某个ConstactFragment类中的child视图。
3)控件:全部小写,采用下划线命名,我一般按照布局文件名_控件名_功能名_属性名方式(前面的布局文件名可选可不选,选的话具备较高的可读性)

如:fragment_constact_child_img_avatar表示fragment_constact_child布局文件中的用户头像的ImageView。

二.常见项目框架

无论是用移动客户端还是PC端的项目,一般都包括三个模块:用户交互层,业务逻辑层,数据持久层
1)用户交互层:呈现给用户的界面模块,应考虑界面性能的高低
          因为要考虑良好的用户体验,所以必须考虑流畅度,让用户在使用App的时候不能感到卡顿
          如:在重新加载某个控件时先判断先前该控件的实例是否存在,若存在直接返回,不存在再创建。
  如在ExpandableListView的ExpandableListAdapter的getChildView代码如下:

[html]  view plain  copy

  1. <span>        </span>public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {
  2.                 // TODO Auto-generated method stub
  3.                 GroupHolder holder = null;
  4.                 if (convertView == null) {
  5.                     convertView = LayoutInflater.from(mContext).inflate(
  6.                             R.layout.fragment_constact_child, null);
  7.                     holder = new GroupHolder();
  8.                     holder.nameView = (TextView) convertView
  9.                             .findViewById(R.id.contact_list_item_name);
  10.                     holder.feelView = (TextView) convertView
  11.                             .findViewById(R.id.cpntact_list_item_state);
  12.                     holder.iconView = (ImageView) convertView.findViewById(R.id.icon);
  13.                     convertView.setTag(holder);
  14.                 } else {
  15.                     holder = (GroupHolder) convertView.getTag();
  16.                 }
  17.                 holder.iconView.setImageResource(R.drawable.head);
  18.                 holder.nameView.setText(getChild(groupPosition, childPosition)
  19.                         .toString());
  20.                 holder.feelView.setText(signString[groupPosition][childPosition]);
  21.                 return convertView;
  22.             }
2)业务逻辑层: 整个项目的核心,不仅仅要考虑功能的实现,还应考虑性能的高低
在功能上就没啥好说,因为不同App一般要实现的功能不同,在性能上一般可以考虑一下几个层面:
2.1)多线程:这个在网络请求中用的比较多。
可以使用线程池,AsyncTask类,Thread+Handler异步消息机制或其它一些比较好的第三方开源库。
2.2)内存:这个主要是图片处理及缓存

1. 加载大图片时,合理设置BitmapFactory.Options的值inSampleSize,减少图片内存占用;

2. 仅请求图片的大小,inJustDecodeBounds = true仅请求图片大小,而不会加载图片到内存;

3. 缓存图片:内存缓存使用lruCache,磁盘缓存使用 DiskLruCache;

4. 使用非UI线程加载图片,使用 AsyncTask;

5. 使用软引用SoftReference

3) 数据持久层:这个一般用来保存用户的信息,磁盘文件及数据库文件
 这三层图示如下:%title插图%num

求大家推荐服务器?

我用服务器做 WordPress 博客,用虚拟主机不能做 ssl 很无语,而阿里云单单做个博客太大材小用了?用西部数码感觉不好用,网速慢,求大家推荐大公司,稳定,便宜网速快的服务商,我买一台做博客。再买一台做私有云

jixiangqd 2
jixiangqd 2017-04-19 11:51:29 +08:00 ❤️ 1
直接用 cnblogs 之类的博客系统就好了,不舍的花钱,还要装出逼格?
Kilerd 3
Kilerd 2017-04-19 11:54:13 +08:00 via iPhone
hostker
crll 4
crll 2017-04-19 12:13:30 +08:00
hostker 确实不错
CEBBCAT 5
CEBBCAT 2017-04-19 12:15:28 +08:00 via Android
又没说要你提供这样的服务,怎么上来就开喷?
110male 6
110male 2017-04-19 13:00:47 +08:00
买服务器托管
ivmm 7
ivmm 2017-04-19 13:04:50 +08:00
谷歌搜索:

Managed WordPress Hosting

$20 刀一个月的,基本上都能满足你的需求,快速、稳定,免维护,高可用
yujizmq 8
yujizmq 2017-04-19 13:05:18 +08:00 via Android
hostker 没毛病
Diss 9
Diss 2017-04-30 01:15:47 +08:00
https://www.daimiyun.com/cart.php?gid=4

黛米云虚拟主机,来吧,免费送你个玩,支持 SSL.。
woshinide300yuan 10
woshinide300yuan 2017-05-03 20:54:57 +08:00
趁*近阿里云新注册用户免费半年的活动没过期,抓紧来一发!

TOPNETS 11
TOPNETS 2017-05-11 15:39:16 +08:00
试试互联先锋 www.idcicp.com
thinkxen 12
thinkxen 2017-05-15 22:04:08 +08:00
阿里云吧 价格很低了~~~
jack2411868 13
jack2411868 2017-06-04 20:32:44 +08:00
6 月*新活动-超值实用 VPS 推荐
http://www.yqvps.com/?p=137
togodo 14
togodo 2017-09-13 22:29:53 +08:00
现在有阿里云的 199 一年活动,用买空间的钱买个服务器。http://blog.csdn.net/cuitang1031/article/details/77727217
lae 15
lae 2018-12-28 19:35:23 +08:00 via Android
直接用的国外的,tophosting.github.io

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速