今天看着以往写的乱七八糟的代码,想着整理下设置这一个功能。
因为现在Matlab已经可以便捷的使用json文件了,不如就选择json文件作为外部储存文件。
Matlab内部变量使用的结构体存储。
类代码如下所示,该属性主要由settingName作为json外部储存文件名称,settingStuct作为结构体变量,save_path等功能以后再做。
下面这个代码为设置的父类,而子类继承父类,构造函数中name锁定为该子类名称,通过这种方式可以较好的管理一些设置,希望这些有一些帮助。
SettingsBase.m
classdef SettingsBase < handle
% 公共属性可以在这里定义,但通常更好的做法是使用getter和setter方法
% 保护属性可以在子类中被访问,但不能在类外部被直接访问
% 不能通过a.settingName访问,这里设置了方法,只能通过方法访问
properties (Access = protected)
% 这里定义一些通用的设置属性
settingName
settingStruct
save_path = ''
end
% 构造函数
methods
function obj = SettingsBase(name)
if nargin > 0
disp('Setting name provided.')
obj.setname(name); % 调用自定义的setter方法
% 注意:setter方法不返回obj,因为MATLAB中对象的修改是通过引用传递的
disp(obj.getname()) % 使用getter方法获取并显示属性值
end
end
end
% 可以添加一些通用的方法,比如保存和加载设置
methods
function saveSettings(obj, filename)
% 总体功能,保存json设置文件
% ...
% 如果传入filename,那么就试用它作为名称,现在暂时不考虑路径
if nargin == 1
filename = obj.getname;
end
%保存文件名与地址
fileext = '.json';
savefilename = strcat(filename, fileext);
%--这里默认'',没有填写,以后看情况读取设置什么的
savefilepath = fullfile(obj.save_path,savefilename);
json_struct = obj.getset;
%将结构体设置写入json文件
jsonStr = jsonencode(json_struct);
fid = fopen(savefilepath,'w');
fprintf(fid,'%s',jsonStr);
fclose(fid);
disp(['Settings saved to file: ', savefilepath]);
end
function loadSettings(obj, filename)
% 加载json设置为结构体
% ...
% disp(nargin);
%filename 这里只定义
%当只有obj作为传参时候,nargin为1,
%当加入filename,之后考虑作为保存路径
if nargin == 1
filename = obj.getname;
end
%保存文件名与地址
fileext = '.json';
savefilename = strcat(filename, fileext);
%--这里默认'',没有填写,以后看情况读取设置什么的
savefilepath = fullfile(obj.save_path,savefilename);
disp(['Loading settings from: ', savefilepath]);
%加载json文件
json_string = fileread(savefilepath);
obj.settingStruct = jsondecode(json_string);
end
% 添加getter和setter方法,用于访问和设置保护属性
function value = getname(obj)
value = obj.settingName;
end
function setname(obj, value)
if ~isempty(value)
disp('Setting name updated.')
obj.settingName = value;
end
end
function value = getset(obj)
value = obj.settingStruct;
end
function setset(obj, value)
if ~isempty(value)
obj.settingStruct = value;
end
end
end
end
子类,目前没有想到更多的功能
DataSettings.m
classdef DataSettings < SettingsBase
% 数据设置特有的属性
properties (Access = protected)
end
% 构造函数,可以调用父类的构造函数来初始化通用设置
methods
function obj = DataSettings()
% 调用父类的构造函数
obj = obj@SettingsBase('data');
end
end
end
%% 准备设置data1.json文件
data = struct('name','joh','age',30);
jsonStr = jsonencode(data(:));
fid = fopen('data1.json','w');
fprintf(fid,'%s',jsonStr);
fclose(fid);
%% 读取设置文件
b = DataSettings();
b.loadSettings('data1');
setStuct = b.getset()
%% 结果
% Setting name provided.
% Setting name updated.
% data
% Loading settings from: data1.json
%
% setStuct =
%
% 包含以下字段的 struct:
%
% name: 'joh'
% age: 30
%% 修改设置文件
setStuct.name = 'haoo';
setStuct.age = 35;
b.setset(setStuct);
b.getset()
%% 结果
% ans =
%
% 包含以下字段的 struct:
%
% name: 'haoo'
% age: 35
当然,这里有很多不足之处,还望大佬提点,敬请赐教。