c# – 这个API可以改进吗?
发布时间:2020-12-15 19:48:46 所属栏目:百科 来源:网络整理
导读:在我们的CORE库中,我们将此类作为20,000行抽象提供. 你能看出它的设计方式有什么问题吗? 注1:此类具有SharpZipLib支持. 注2:SharpZipLib约为20K线. public static class Compression{ public static Byte[] CompressBytes(Byte[] input); public static B
在我们的CORE库中,我们将此类作为20,000行抽象提供.
你能看出它的设计方式有什么问题吗? 注1:此类具有SharpZipLib支持. 注2:SharpZipLib约为20K线. public static class Compression { public static Byte[] CompressBytes(Byte[] input); public static Byte[] CompressBytes(Byte[] input,Format format); public static Byte[] CompressBytes(Byte[] input,Format format,Level level); public static Byte[] DecompressBytes(Byte[] input); public static Byte[] DecompressBytes(Byte[] input,Format format); public static String CompressString(String input); public static String CompressString(String input,Format format); public static String CompressString(String input,Level level); public static String DecompressString(String input); public static String DecompressString(String input,Format format); public static void CompressFile(String input_file_path,String output_file_path); public static void CompressFile(String input_file_path,String output_file_path,Format format); public static void CompressFile(String input_file_path,Level level); public static void DecompressFile(String input_file_path,String output_file_path); public static void DecompressFile(String input_file_path,Format format); public static void CompressFolder(String input_folder_path,String output_file_path); public static void CompressFolder(String input_folder_path,Format format); public static void CompressFolder(String input_folder_path,Level level); public static void DecompressFolder(String input_file_path,String output_file_path); public static void DecompressFolder(String input_file_path,Format format); } 解决方法
我建议将这个单独的类分成几个类.一般来说,静态实用程序类会破坏很多规则,其中最重要的是分离关注点.虽然是,但是这个类中的所有方法都处理压缩,它们关注的是压缩不同的东西.一些压缩字节数组,一些压缩字符串,一些压缩文件.我会将这个单一实用程序分解为多个实用程序
public static class ByteCompression { public static Byte[] Compress(Byte[] input); public static Byte[] Compress(Byte[] input,Format format); public static Byte[] Compress(Byte[] input,Level level); public static Byte[] Decompress(Byte[] input); public static Byte[] Decompress(Byte[] input,Format format); } public static class StringCompression public static String Compress(String input); public static String Compress(String input,Format format); public static String Compress(String input,Level level); public static String Decompress(String input); public static String Decompress(String input,Format format); } public static class FileCompression { public static void Compress(String input_file_path,String output_file_path); public static void Compress(String input_file_path,Format format); public static void Compress(String input_file_path,Level level); public static void Decompress(String input_file_path,String output_file_path); public static void Decompress(String input_file_path,Format format); } public static FolderCompression { public static void Compress(String input_folder_path,String output_file_path); public static void Compress(String input_folder_path,Format format); public static void Compress(String input_folder_path,Format format); } 上述实用程序类减少了重复,更好的封装目的,与其成员方法更具凝聚力,并且意图更清晰.您确实有四种静态实用程序类型而不是一种,但您并没有以这种方式破坏尽可能多的规则/最佳实践.尽量避免单片,do-everything实用程序类.如果可以的话,找到一种方法来使它们成为实例类而不是静态类,特别是如果在每个压缩/解压缩方法中使用的类级别存在任何共享数据.这将提高线程安全性. 编辑: 正如andy评论的那样,更理想的实现将使用扩展方法.文件和文件夹压缩作为扩展实现起来有点困难,但我已经尝试过了.以下示例更好地实现了我的目标:将名词(或主题)与动词(或操作)分离,提供更清晰的API,最终重复次数更少,保持关注点分离,并且被正确封装. public static class ByteCompressionExtensions { public static byte[] Compress(this byte[] input); public static byte[] Compress(this byte[] input,Format format); public static byte[] Compress(this byte[] input,Level level); public static byte[] Decompress(this byte[] input); public static byte[] Decompress(this byte[] input,Format format); } // In use: byte[] myArray = new byte[] { ... }; byte[] compArray = myArray.Compress(); // Subject (noun) -----^ ^----- Operation (verb) public static class StringCompressionExtensions { public static byte[] Compress(this string input); public static byte[] Compress(this string input,Format format); public static byte[] Compress(this string input,Level level); // Extension method fail!! :( :( This conflicts with Decompress from the class above! public static string Decompress(this byte[] input); public static string Decompress(this byte[] input,Format format); } // In use: string myStr = "A string!"; byte[] compArray = myStr.Compress(); // Subject (noun) ---^ ^----- Operation (verb) myStr = compArray.Decompress(); // Fail! :( public static class FileCompressionExtensions { public static void Compress(this FileInfo input,FileInfo output); public static void Compress(this FileInfo input,FileInfo output,Format format); public static void Compress(this FileInfo input,Level level); public static void Decompress(this FileInfo input,FileInfo output); public static void Decompress(this FileInfo input,Format format); } // In use: FileInfo myFile = new FileInfo(input_file_path); FileInfo myCompFile = new FileInfo(output_file_path); myFile.Compress(myCompFile); // Subject (noun) --^ ^----- Operation (verb) myCompFile.Decompress(myFile); public static class FolderCompressionExtensions { public static void Compress(this DirectoryInfo input,DirectoryInfo output); public static void Compress(this DirectoryInfo input,DirectoryInfo output,Format format); public static void Compress(this DirectoryInfo input,Level level); public static void Decompress(this DirectoryInfo input,DirectoryInfo output); public static void Decompress(this DirectoryInfo input,Format format); } // In use: DirectoryInfo myDir = new DirectoryInfo(input_folder_path); DirectoryInfo myCompDir = new DirectoryInfo(output_folder_path); myDir.Compress(myCompDir); // Subject (noun) --^ ^----- Operation (verb) myCompDir.Decompress(myDir); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |