Добро пожаловать в Переполнение стека.
Если ваш код зафиксирован и передан, вы почти ничего не можете сделать безопасно, так что не беспокойтесь об ошибках.
Тем не менее, в вашем конкретном случае вам не нужно делать много. Просто создайте новый каталог project-one
, используя mkdir project-one
. Переместите file-one
и file-two
в него, используя git mv file-one file-two project-one
, а затем подтвердите новые изменения, используя git commit
(команда git mv автоматически установит переименования)
Хорошо, эмпирическое правило: если Вы видите a switch
оператор в Вашем эскизе кода, это - знак, необходимо использовать полиморфизм вместо этого. Так, в этом случае Вы хотите смочь перенести различные операции, и Вы желаете a switch
, таким образом, необходимо думать, "как я могу сделать это чем-то с помощью полиморфизма?"
Теперь, взгляните на Шаблон "команда", где Ваши объекты являются глаголами вместо существительных. Каждая Команда реализует a doThis()
метод; при построении объекта Вы устанавливаете то, что команду wil делают.
public interface Command {
public void doThis(Graphics g); // I don't promise returning
// void is the best choice
// Would it be better to return a Graphics object?
}
public class DrawRectangle implements Command {
public DrawRectagle( Point topLeft, Point btmRight) { // ...
}
public void doThis(Graphics g){ // ...
}
}
Теперь, рассмотрите то, что Вы сделали бы, если бы Вы хотели реализовать отмену?
Хорошо, давайте расширим это немного больше. Точка использования этого шаблона должна удостовериться, что клиент не должен знать все так очень, кроме тех случаев, когда Вы делаете исходную конструкцию. Таким образом для этого примера, давайте думать о рисовании прямоугольника. Когда Вы picka инструмент Rectangle, Вы собираетесь иметь некоторый код обработчика событий нажатия кнопки (это - весь псевдокод btw),
cmdlist = [] // empty list
bool firstClick = true
Point tl = br = new Point(0,0)
onClick:
if firstClick:
get mouse position into tl
firstClick = false
else:
get mouse position into br
cmdlist.append(new DrawRectangle(tl, br))
firstClick = true
Таким образом, теперь, когда Вы выбрали прямоугольник, Вы добавляете объект DrawRectangle к структуре списка команд. Когда-то позже Вы пробегаете список
for cmd in cmdlist:
cmd.doThis(Graphics g)
и эти вещи сделаны. Это должно быть очевидно теперь, когда Вы реализовали бы отмену путем добавления "undoThis" метода для Управления. При создании команды необходимо создать код так, чтобы объект знал, как отменить себя. Затем отмените средства просто взятие последнего Объекта команды от списка и выполнения его undoThis метода.
Как насчет Вас разрабатывают Ваш интерфейс немного complexer? Позволяет начинаются с некоторым кодом, и впоследствии я объясню, как он, как предполагается, работает.
public class AbstractDrawingTool {
private Graphics g;
void AbstractDrawingTool( Graphics g ) {
this.g = g;
}
void keyDown(KeyEvent e);
void keyUp(KeyEvent e);
void mouseMove(MouseEvent e);
void mouseClick(MouseEvent e);
void drop();
// other stuff
}
Идея состоит в том, чтобы передать ввод данных пользователем к инструменту, когда-то пользователь начинает работать с определенной реализацией. Таким образом, Вы могли создать много различных инструментов для рисования все использование того же интерфейса. Простой PointDrawingTool, например, только реализовал бы событие щелчка мышью для размещения точки в холст. PolygonDrawingTool также реализовал бы keyUp событие так, чтобы он мог остановить проведение линий, когда определенная клавиша (т.е. клавиша выхода) была нажата.
Особый случай является методом отбрасывания. Это назвали бы, для "отбрасывания" в настоящее время выбираемого инструмента. Это произошло бы, если бы другая реализация была выбрана из панели инструментов или подобная.
Вы могли также объединить это определение с шаблоном "команда". В этом случае реализация AbstractDrawingTool была бы ответственна за создание экземпляров интерфейса Command и возможно разместила бы их в стек, после того как операция закончена (т.е. размещение точки на холсте).
Я столкнулся с подобной проблемой при попытке перепроектировать мое отображение SW для поддержки и GDI + и Каирских библиотек графики. Я решил его путем сокращения интерфейса рисунка до некоторых общих операций/примитивов, см. код ниже.
После этого "эффекты", которые Вы хотите потянуть, являются Командами (как Charlie, говорит). Они используют IPainter
взаимодействуйте через интерфейс для рисования. Хорошая вещь об этом подходе состоит в том, что эффекты полностью отделяются от конкретного механизма рисунка как GDI +. Это прибывает удобное ко мне, так как я мог затем экспортировать свой рисунок в SVG путем переключения на Каирский механизм.
Конечно, при необходимости в некоторых дополнительных графических операциях необходимо было бы расшириться IPainter
интерфейс с ним, но базовая философия остается таким же. Посмотрите больше об этом здесь: http://igorbrejc.net/development/c/welcome-to-cairo
public interface IPainter : IDisposable
{
void BeginPainting ();
void Clear ();
void DrawLines (int[] coords);
void DrawPoint (int x, int y);
void EndPainting ();
void PaintCurve (PaintOperation operation, int[] coords);
void PaintPolygon (PaintOperation operation, int[] coords);
void PaintRectangle (PaintOperation operation, int x, int y, int width, int height);
void SetHighQualityLevel (bool highQuality);
void SetStyle (PaintingStyle style);
}
public class PaintingStyle
{
public PaintingStyle()
{
}
public PaintingStyle(int penColor)
{
this.penColor = penColor;
}
public int PenColor
{
get { return penColor; }
set { penColor = value; }
}
public float PenWidth
{
get { return penWidth; }
set { penWidth = value; }
}
private int penColor;
private float penWidth;
}
public enum PaintOperation
{
Outline,
Fill,
FillAndOutline,
}