日期:2014-05-20  浏览次数:20993 次

[讨论]无注释编程
以前LZ也是一个满篇注释的Coder,但是自从到这个公司,除了写别人调用的api,
有个简单的api功能描述,其他什么都没有。

OK,我就不光说不练了,给大家看看我的代码先。

C# code

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Collections.Specialized;
using System.Web;
using System.IO;
using XXX.Lib;

namespace XXX
{
    // Url辅助类:对Url进行初步的解析
    public class UrlHelper
    {
        const int MAX_URI_LENGTH = 512;
        string _scriptName = string.Empty;
        CommandResult _parseResult = CommandResult.Success;
        NameValueCollection _parameters = new NameValueCollection();
        char[] _uriInvalidChar = new char[] { '/', '\\' };
        char[] _pathInvalidChar = new char[] { '/', '\\', ':', '*', '?', '\"', '<', '>', '|' };
        public Uri _uri = null;

        public string ScriptName
        {
            get { return _scriptName; }
        }

        public NameValueCollection Parameters
        {
            get { return _parameters; }
        }

        public CommandResult ParseResult
        {
            get { return _parseResult; }
        }

        public UrlHelper(Uri originalUri)
        {
            _uri = ReplaceUri(originalUri);

            if (IsUriLengthError())
            {
                return;
            }

            if (CheckPathAndQuery())
            {
                ParsePathAndQuery();
            }

        }

        private Uri ReplaceUri(Uri originalUri)
        {
            string uriStr = ReplaceUriWithUrlModel(originalUri);

            if (uriStr == "")
            {
                return originalUri;
            }
            else
            {
                return new Uri(uriStr);
            }
        }

        private static string ReplaceUriWithUrlModel(Uri originalUri)
        {
            string[] splitStr = null;
            try
            {
                foreach (var item in File.ReadAllLines(Hisan.Lib.SystemLib.GetAppRootDir() + "UrlModel.ini"))
                {
                    splitStr = item.Split(new string[] { "->" }, StringSplitOptions.RemoveEmptyEntries);
                    if (splitStr == null || splitStr.Length != 2)
                    {
                        continue;
                    }

                    if (splitStr[0].Trim() == originalUri.PathAndQuery.Substring(1))
                    {
                        return originalUri.AbsoluteUri.Replace(splitStr[0].Trim(), splitStr[1].Trim());
                    }
                }
            }
            catch
            {

            }
            return "";
        }

        private bool IsUriLengthError()
        {
            if (_uri == null || _uri.ToString().Length > MAX_URI_LENGTH)
            {
                _parseResult = CommandResult.UrlTooLong;
                return true;
            }
            return false;
        }

        private bool CheckPathAndQuery()
        {
            string pathAndQuery = _uri.PathAndQuery.Substring(1);

            if (IsUrlInvalidChar(pathAndQuery))
            {
                return false;
            }

            if (pathAndQuery.IndexOfAny(_uriInvalidChar) >= 0)
            {
                _parseResult = CommandResult.UrlInvalidChar;
                return false;
            }
            else if (pathAndQuery.Length == 0)
            {
                _parseResult = CommandResult.NoExistsMethod;
                return false;
            }

            string[] splitPathAndQuery = new string[] { };
            if (IsFileNameInvalidChar(pathAndQuery, splitPathAndQuery))
            {
                return false;
            }

            return true;

        }

        private bool IsFileNameInvalidChar(string pathAndQuery, string[] splitPathAndQuery)
        {
            splitPathAndQuery = pathAndQuery.Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries);
            if (splitPathAndQuery[0].IndexOfAny(_pathInvalidChar) >= 0)
            {
                _parseResult = CommandResult.FileNameInvalidChar;
                return true;
            }
            return false;
        }

        private bool IsUrlInvalidChar(string pathAndQuery)
        {
            if (pathAndQuery.IndexOfAny(_uriInvalidChar) >= 0)
            {
                _parseResult = CommandResult.UrlInvalidChar;
                return true;
            }
            return false;
        }

        private void ParsePathAndQuery()
        {
            string[] splitPathAndQuery = _uri.PathAndQuery.Substring(1).Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries);
            SetScriptNameAndParameters(splitPathAndQuery);
        }

        private void SetScriptNameAndParameters(string[] splitPathAndQuery)
        {
            _scriptName = splitPathAndQuery[0];

            if (splitPathAndQuery.Length > 1)
            {
                _parameters = HttpUtility.ParseQueryString(splitPathAndQuery[1], Encoding.UTF8);
            }
        }

    }
}