Заметка о «качестве кода» или решение простых задач специалистами не всегда бывает рациональным

1 Авг
2012

1. Постановка задачи

Одним из элементов электронного документооборота, принятого в моей конторе, является требование сохранять документы с указанием в начале названия файла даты в формате yyyy-mm-dd. Соблюдение этого требования позволяет быстро отслеживать историю изменения документа и всегда находить последнюю актуальную версию.
2. Решение

Чтобы упростить жизнь своим сотрудникам, руководство обратилось к помощи программистов, сформулировав требование следующим образом: «При нажатии горячего сочетания клавиш в любом месте должна появляться строка с датой в формате yyyy-mm-dd». Программисты были профессиональные и написал код на C#.NET.

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Ctrl_D
{
	public class Ctrl_D : Form
	{
		private const int VK_CTRL = 2;
		private const int VK_D = 0x44;
		private const int CTRLD_KEY_ID = 9;
		private const int WM_HOTKEY = 0x312; // hotkey message

		[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
		public static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
		[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
		public static extern int UnregisterHotKey(IntPtr hwnd, int id);


		[STAThread]
		public static void Main()
		{
			Application.Run(new Ctrl_D());
		}

		private NotifyIcon trayIcon;
		private ContextMenu trayMenu;

		public Ctrl_D()
		{
			// Create a simple tray menu with only one item.
			trayMenu = new ContextMenu();
			trayMenu.MenuItems.Add("Exit", OnExit);

			// Create a tray icon. 
			trayIcon = new NotifyIcon();
			trayIcon.Text = "The Ctrl+D pastes the current date as yyyy-MM-dd to anyplace";

			trayIcon.Icon = new Icon(GetType(), "Ctrl_D.ico");

			// add menu to tray icon and show it
			trayIcon.ContextMenu = trayMenu;
			trayIcon.Visible = true;

		}

		protected override void OnLoad(EventArgs e)
		{
			Visible = false; // hide form window
			ShowInTaskbar = false; // remove from taskbar

			RegisterHotKey(this.Handle, CTRLD_KEY_ID, VK_CTRL, VK_D);

			base.OnLoad(e);
		}

		private void OnExit(object sender, EventArgs e)
		{
			Application.Exit();
		}

		protected override void Dispose(bool isDisposing)
		{
			if (isDisposing)
			{
				// release the icon resource
				trayIcon.Dispose();
				UnregisterHotKey(this.Handle, CTRLD_KEY_ID);
			}

			base.Dispose(isDisposing);
		}

		protected override void WndProc(ref Message m)
		{
			if ((m.Msg == 0x312) & (m.WParam.ToInt32() == CTRLD_KEY_ID))
			{
				bool isClipboardContainsText = Clipboard.GetDataObject().GetDataPresent(DataFormats.Text);
				var origClipboardText = String.Empty;

				// store original clipboard text
				if (isClipboardContainsText)
					origClipboardText = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString();

				// paste current date
				Clipboard.SetDataObject(DateTime.Now.Date.ToString("yyyy-MM-dd"));
				SendKeys.SendWait("^v");

				// restore original clipboard text
				if (isClipboardContainsText)
					Clipboard.SetDataObject(origClipboardText);
			}
			base.WndProc(ref m);
		}

	}
}

Как видно из кода, программа копирует текущее содержимое буфера обмена, затем подставляет в буфер обмена дату, затем имитирует нажатие горячего сочетания клавиш для вставки из буфера, затем восстанавливает исходное содержимое буфера обмена.
3. Проблемы и доработка

Программу внедрили, но при использовании стали возникать проблемы с буфером обмена. Очевидной стала необходимость доработки программы. На помощь пришли другие программисты, менее опытные и вовсе не профессиональные, которые выдали скрипт на языке AutoIT:
Global $Paused
HotKeySet("^d", "func1")
While 1
    Sleep(100)
WEnd
Func func1()
    Send(<hh user=YEAR> & '-' & <hh user=MON> & '-' & <hh user=MDAY>)
 EndFunc

Краткость — их сестра. Решение рабочее, проблем с буфером обмена не создаёт.
Заключение

К чему все эти строки. К тому, что повседневная рутина при решении сложных задач не всегда даёт рациональный результат при решении простых задач. Каждая задача требует учёта её масштаба. Нужно смотреть на результаты своего труда критически и не зацикливаться на принятых алгоритмах своей работы.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх