类设计:允许一个类中使用两个作为一个对象,并且还提供公共静态方法
-
21-09-2019 - |
题
我有傻,小类“的 FileSystemSize 强>”,其既可以作为一个对象,并且还通过公共的,静态的方法被使用。输出是类似的,但不相同的在每种情况下。
类为的 intially静态,但我加入到初始化它作为一个目的是允许在未来的版本新的“的方便的方法强>”延伸的可能性,而不需要对于很多参数解析。例如,我有 GetKBString(), GetMBString(),等等方法来允许获取文件的大小方便格式化我想它(作为一个字符串)的方式。在内部,类存储的文件字节大小为双
我,如果这都有道理有点糊涂。好像我也许应该分成静态版本和对象版本,如微软确实为Directory和DirectoryInfo的这一点。然而,它只是似乎更容易我有这一切都在一个地方与不能被误认为一个名字 - 它应该是清楚FileSystemSize呢?是否有维修,我不期待任何影响?那是什么味道?
var mypath = @"C:\mypath";
var filesystemsize = new FileSystemSize(mypath);
string kilobytes = filesystemsize.GetKBString();
string megabytes = filesystemsize.GetMBString();
double bytes = filesystemsize.ByteSize;
double staticbytes = FileSystemSize.GetDirectoryBytesSize(new DirectoryInfo(mypath));
double statickilobytes = FileSystemSize.ConvertSize(staticbytes, "KB");
解决方案
看它的另一种方式:你为什么把字符串/数字/ UI格式化您的FileSystemSize方法方法
虽然它可以就该文件的使用,这是功能性的一般一块恕我直言应该在一个组织良好的图书馆找到其他地方 - 就像路径功能在文件或目录类的一部分.NET,我会把“格式化数”在字符串或数学utils的类的方法。
分开你的对象的责任,你会发现,没有必要在这样的情况下,静态和非静态成员混合。
其他提示
有一个很好的测试:如果你问自己,我们是否它是好的,有机会的话它不是
这可能不是自然类的用户必须通过对象的一些方法通过类访问和其他人,特别是当第二并不真正需要的类的实例属性。很可能他们会感到困惑,将参照这样的:“跆拳道这个程序员做了?!”
。我建议所有实例方法,如果你喜欢的可能性要扩展类,无论是与扩展方法或通过继承。
既然你没有在FileSystemSize很多国家,这不就是为扩展方法的最佳人选?
我个人提供扩展格式数作为文件大小的字符串并且使用enum
指定如何格式化文件大小:
public static class FileSystemSize
{
public static long GetDirectoryBytesSize(string path);
}
public static class NumberExtensions
{
public static string FormatAsFileSize(
this long fileSize, FileSizeStringFormat format);
}
public enum FileSizeStringFormat
{
KiloByte,
MegaByte,
}
如果您正在使用C#3.0,你的意图,可以更好地扩展方法和IFormatProviders表示。在代码中,这可能是对的FileInfo和DirectoryInfo的方法的ToString扩展方法,所以他们会读是这样的:
var directorySize = myDirectory.ToString("GB");
var fileSize = myFile.ToString("MB");
在上面的代码感觉对你正在尝试做的更加自然。
请参阅如何为您提供以下工作。其中一些需要进行测试(递归方法DirectoryInfoExtender.GetDirectorySize想到)。如果你需要能够写这样Console.WriteLine("{0:GB}", fileInfo)
声明,您也可以考虑编写的IFormatProvider为好。
另外请注意,我特意skimped上null检查和异常处理这些公开访问的方法。
public static class DirectoryInfoExtender
{
public static string ToString(this DirectoryInfo d, string format, int fractionalDigits)
{
double fileSize = GetDirectorySize(d);
return FileSizeConverter.GetFileSizeString(fileSize, format, fractionalDigits);
}
public static double GetDirectorySize(DirectoryInfo d)
{
var files = d.GetFiles();
var directories = d.GetDirectories();
if(files.Length == 0 && directories.Length == 0)
{
return 0;
}
else
{
double size = 0;
foreach(var file in files)
{
size += file.Length;
}
foreach(var directory in directories)
{
size += GetDirectorySize(directory);
}
}
return size;
}
}
public static class FileInfoExtender
{
public static string ToString(this FileInfo f, string format, int fractionalDigits)
{
return FileSizeConverter.GetFileSizeString(f.Length, format, fractionalDigits);
}
}
public class FileSizeConverter
{
public static string GetFileSizeString(double fileSize, string format, int fractionalDigits)
{
long divisor;
string sizeIndicator;
switch(format.ToLower().Trim())
{
case "gb":
divisor = (long)Math.Pow(2, 30);
sizeIndicator = "gigabytes";
break;
case "mb":
divisor = (long) Math.Pow(2, 20);
sizeIndicator = "megabytes";
break;
case "kb":
divisor = (long)Math.Pow(2, 10);
sizeIndicator = "kilobytes";
break;
default:
divisor = 1;
sizeIndicator = "bytes";
break;
}
return String.Format("{0:N" + fractionalDigits +"} {1}", fileSize / divisor, sizeIndicator);
}
}
标准气味的静态方法的使用 - 这使得它很难的情况下,保持你使用这些方法都在你的代码
另一个气味恕我直言是:类名称不明确其实际作用。从你的描述是指在这种情况下,我会提到它的类名格式的数据。