zoukankan      html  css  js  c++  java
  • Unity 游戏框架搭建 2019 (三十二、三十三) 类的命名 & 代码文件命名

    昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整。

    我们今天再往下接着调整。

    我们来看下接下来的 MenuItem

    代码如下:

    		[MenuItem("QFramework/8.总结之前的方法/3.生成文件名到剪切板")]
    		private static void MenuClicked3()
    		{
    			CommonUtil.CopyText(Exporter.GenerateUnityPackageName());		
    		}
    

    CommonUtil 已经提取成第二个示例了。
    Exporter.GenerateUnityPackageName() 这个方法的定义在第八个示例 PreviousFunctions 类的上方。它属于专门为导出功能定制的代码,也就是在其他情况下不适用的。

    而这个 MenuItem 本身呢,现在没有太大的用处。有用的部分是 Exporter.GenerateUnityPackageName 的方法定义和所在的类。

    所以这个 MenuItem 就直接删除了。

    删除之后,我们把 Exporter 这个类移动到第一个示例里,因为第一个示例是导出功能所在的地方,Exporter 类呢本身就是一个导出功能的一部分。

    第一个示例原来的代码如下:

    using System.IO;
    
    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    using UnityEngine;
    
    namespace QFramework
    {
    	public class CustomShortCut : MonoBehaviour
    	{
    #if UNITY_EDITOR
    		[MenuItem("QFramework/1.导出 UnityPackage %e",false,1)]
    		private static void MenuClicked()
    		{
    			var generatePackageName = Exporter.GenerateUnityPackageName();
    			
    			EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
    			
    			EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
    		}
    #endif
    	}
    }
    

    移动 Exporter 类之后变成如下:

    using System;
    using System.IO;
    
    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    using UnityEngine;
    
    namespace QFramework
    {	
    	public class Exporter
    	{
    		public static string GenerateUnityPackageName()
    		{
    			return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
    		}
    	}
    	
    	public class CustomShortCut : MonoBehaviour
    	{
    #if UNITY_EDITOR
    		[MenuItem("QFramework/1.导出 UnityPackage %e",false,1)]
    		private static void MenuClicked()
    		{
    			var generatePackageName = Exporter.GenerateUnityPackageName();
    			
    			EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
    			
    			EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
    		}
    #endif
    	}
    }
    

    到这里,我们发现,Exporter 类可以和 CunstomShortCut 类进行合并,合并之后的类名是 Exporter,而代码的文件名改成了 Exporter.cs。

    代码如下:
    Exporter.cs

    using System;
    using System.IO;
    
    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    using UnityEngine;
    
    namespace QFramework
    {	
    	public class Exporter
    	{
    #if UNITY_EDITOR
    		[MenuItem("QFramework/1.导出 UnityPackage %e",false,1)]
    		private static void MenuClicked()
    		{
    			var generatePackageName = Exporter.GenerateUnityPackageName();
    			
    			EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
    			
    			EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
    		}
    #endif
    		
    		public static string GenerateUnityPackageName()
    		{
    			return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
    		}
    	}
    }
    

    目录结构如下:
    006tNc79gy1fzfrcaihnsj30km0ikjud.jpg

    这样第八个示例的第三个 MenuItem 就整理完毕了。

    小结

    其实在整理第一个示例的时候,第一个示例的类的名字 CustomShortCut 就有很大的问题。我们第一个示例的功能是 导出 UnityPackage,类名却叫 自定义快捷键,这样比较奇怪。但是当时没有发现,因为只去关注菜单名是否和文件夹名是否一致了,没有考虑类名是否合理。

    所以呢,我们的规范和约定要加入上一个条例:

    1. 要给类/代码文件取合适的命名。

    加上之后如下:

    约定和规则:

    • 每个示例在 QFramework 目录下创建一个文件夹,文件夹的格式是: 数字.示例的功能
      • 每个示例写一个脚本,脚本中包含可复用的静态方法和 MenuItem 方法。
      • 每写一个示例进行一次导出,导出的文件名后边加上日期和时间,这个功能已经在导出功能里内置了。
      • 每次有 API 变更的时候做一次备份,备份的名字采用 QFramework_vX.Y.Z 格式。
      • 每次进行整理的时候要确保是在功能有效的情况下进行删除和变更。
      • 确保菜单名和文件夹名一致(新增)
      • 要给类/代码文件取合适的命名(新增)
      • 在删除弃用代码的步骤:
        1. 消除弃用警告。
        2. 搜索弃用方法的引用,并逐个升级为最新的方法。
        3. 全局搜索方法名,并根据情况逐个升级为新的方法。

    在上面 我们通过第八个示例的第三个 MenuItem 方法,我们更新了约定和规则。

    我们接着往下整理。

    第八个示例的第四个 MenuItem 方法

    		[MenuItem("QFramework/8.总结之前的方法/4.导出 UnityPackage")]
    		private static void MenuClicked4()
    		{
    			EditorUtil.ExportPackage("Assets/QFramework",Exporter.GenerateUnityPackageName() + ".unitypackage");
    		}
    

    这个 MenuItem 可以删除了,因为功能已经在第一个示例实现过了。

    第八个示例的第五个 MenuItem 方法

    		[MenuItem("QFramework/8.总结之前的方法/5.打开所在文件夹")]
    		private static void MenuClicked5()
    		{
    			EditorUtil.OpenInFolder(Application.dataPath);
    		}
    

    同样也删除了。

    第八个示例的第六个 MenuItem 方法

    		[MenuItem("QFramework/8.总结之前的方法/6.MenuItem 复用")]
    		private static void MenuClicked6()
    		{
    			EditorUtil.CallMenuItem("QFramework/8.总结之前的方法/4.导出 UnityPackage");
    			EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
    		}
    

    这个不能马上删除,因为这是 EditorUtil.CallMenuItem 仅有的一个调用的地方。

    所以要留着,但是这个功能其实已经失效了,因为 "QFramework/8.总结之前的方法/4.导出 UnityPackage" 这个 MenuItem 被我们刚才删掉了。好吧,这种危险的操作又做了一次。

    不过没关系,因为不是很重要的功能,还好损失不大。那么这个 MenuItem 方法呢,要改成如下:

    	public class PreviousFunctions : MonoBehaviour
    	{		
    #if UNITY_EDITOR		
            [MenuItem("QFramework/3.MenuItem 复用",false,3)]
    		private static void MenuClicked()
    		{
    			EditorUtil.CallMenuItem("QFramework/2.复制文本到剪切板");
    		}
    #endif
    	}
    

    代码很容易理解。菜单名字改变了,所以我们的文件夹和类名都要改变。

    更改后的目录如下:
    006tNc79gy1fzfrddmxuoj30io0kin05.jpg

    代码如下:

    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    using UnityEngine;
    using System;
    using System.IO;
    
    namespace QFramework
    {
    	public class EditorUtil
    	{
    #if UNITY_EDITOR
    		public static void CallMenuItem(string menuPath)
    		{
    			EditorApplication.ExecuteMenuItem(menuPath);
    		}
    
    		public static void OpenInFolder(string folderPath)
    		{
    			Application.OpenURL("file:///" + folderPath);
    		}
    		
    		public static void ExportPackage(string assetPathName,string fileName)
    		{
    			AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
    		}
    #endif
    	}
    
    	public class ReuseMenuItem : MonoBehaviour
    	{		
    #if UNITY_EDITOR		
    		[MenuItem("QFramework/3.MenuItem 复用",false, 3)]
    		private static void MenuClicked()
    		{
    			EditorUtil.CallMenuItem("QFramework/2.复制文本到剪切板");
    		}
    #endif
    	}
     }
    

    我们发现其实还有一个类 EditorUtil,刚好 ReuseMenuItem 是 EditorUtil 中 CallMenuItem 的使用代码。
    所以可以进行合并,合并之后代码如下:

    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    using UnityEngine;
    
    namespace QFramework
    {
    	public class EditorUtil
    	{
    #if UNITY_EDITOR
    		[MenuItem("QFramework/3.MenuItem 复用",false,3)]
    		private static void MenuClicked()
    		{
    			CallMenuItem("QFramework/2.复制文本到剪切板");
    		}
    
    		public static void CallMenuItem(string menuPath)
    		{
    			EditorApplication.ExecuteMenuItem(menuPath);
    		}
    
    		public static void OpenInFolder(string folderPath)
    		{
    			Application.OpenURL("file:///" + folderPath);
    		}
    
    		public static void ExportPackage(string assetPathName, string fileName)
    		{
    			AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
    		}
    #endif
    	}
    }
    

    但是类的名字,改变了,而类所在的文件名还是 ReuseMenuItem,这应该怎么办?

    这是一个规则之间的互相制衡导致的冲突。

    笔者的解决办法就是,把代码名字改成 EditorUtil,最起码类名和文件名一致了。功能名和菜单名也一致了。而 EditorUtil 总好过一个 CustomShortCut 或者 PreviousFunctions 这样的命名。而为什么 EditorUtil 更好,那么这个以后会专门讲,现在呢,我们就先这样做就好了。

    文件名改完之后,目录结构如下图所示.
    006tNc79gy1fzfrdgs8gkj30ka0i6god.jpg

    这样完整的第八个示例,就全部整理完了,通过第八个示例整理出来了第三个示例。删除了很多冗余代码,很有成就感。

    今天的内容就这些。拜拜~

    转载请注明地址:凉鞋的笔记:liangxiegame.com

    更多内容

  • 相关阅读:
    从头到尾彻底理解KMP
    [CF1220E] Tourism
    [CF446C] DZY Loves Fibonacci Numbers
    [CF1003E] Tree Constructing
    [CF1238E] Keyboard Purchase
    [CF915E] Physical Education Lessons
    [CF788B] Weird journey
    [CF1371E2] Asterism (Hard Version)
    [CF780E] Underground Lab
    [CF372C] Watching Fireworks is Fun
  • 原文地址:https://www.cnblogs.com/liangxiegame/p/12684789.html
Copyright © 2011-2022 走看看