Почему существуют шаблоны проектирования js \ java \ python, специфичные для языка? Должны ли они быть универсальными? [Duplicate]

Вот рабочий порт исходного ответа :

KeyboardHook.vb

Imports System.Runtime.InteropServices

Public NotInheritable Class KeyboardHook
    Implements IDisposable

    ' Registers a hot key with Windows.
     _
    Private Shared Function RegisterHotKey(hWnd As IntPtr, id As Integer, fsModifiers As UInteger, vk As UInteger) As Boolean
    End Function

    ' Unregisters the hot key with Windows.
     _
    Private Shared Function UnregisterHotKey(hWnd As IntPtr, id As Integer) As Boolean
    End Function

    ''' 
    ''' Represents the window that is used internally to get the messages.
    ''' 
    Private Class Window
        Inherits NativeWindow
        Implements IDisposable
        Private Shared WM_HOTKEY As Integer = &H312

        Public Sub New()
            ' create the handle for the window.
            Me.CreateHandle(New CreateParams())
        End Sub

        Public Event KeyPressed As EventHandler(Of KeyPressedEventArgs)

        ''' 
        ''' Overridden to get the notifications.
        ''' 
        ''' 
        Protected Overrides Sub WndProc(ByRef m As Message)
            MyBase.WndProc(m)

            ' check if we got a hot key pressed.
            If m.Msg = WM_HOTKEY Then
                ' get the keys.
                Dim key As Keys = DirectCast((CInt(m.LParam) >> 16) And &HFFFF, Keys)
                Dim modifier As ModifierKeys = DirectCast(CUInt(CInt(m.LParam) And &HFFFF), ModifierKeys)

                ' invoke the event to notify the parent.
                RaiseEvent KeyPressed(Me, New KeyPressedEventArgs(modifier, key))
            End If
        End Sub

#Region " IDisposable Members"

        Public Sub Dispose() Implements IDisposable.Dispose
            Me.DestroyHandle()
        End Sub

#End Region
    End Class

    Private _window As New Window()
    Private _currentId As Integer

    Public Sub New()
        ' register the event of the inner native window.
        AddHandler _window.KeyPressed, Sub(sender As Object, args As KeyPressedEventArgs)
                                           RaiseEvent KeyPressed(Me, args)
                                       End Sub
    End Sub

    ''' 
    ''' Registers a hot key in the system.
    ''' 
    ''' The modifiers that are associated with the hot key.
    ''' The key itself that is associated with the hot key.
    Public Sub RegisterHotKey(modifier As ModifierKeys, key As Keys)
        ' increment the counter.
        _currentId = _currentId + 1

        ' register the hot key.
        If Not RegisterHotKey(_window.Handle, _currentId, DirectCast(modifier, UInteger), CUInt(key)) Then
            'Throw New InvalidOperationException("Couldn’t register the hot key.")
            'or use MsgBox("Couldn’t register the hot key.")
        End If
    End Sub

    ''' 
    ''' A hot key has been pressed.
    ''' 
    Public Event KeyPressed As EventHandler(Of KeyPressedEventArgs)

#Region " IDisposable Members"

    Public Sub Dispose() Implements IDisposable.Dispose
        ' unregister all the registered hot keys.
        Dim i As Integer = _currentId
        While i > 0
            UnregisterHotKey(_window.Handle, i)
            System.Math.Max(System.Threading.Interlocked.Decrement(i), i + 1)
        End While

        ' dispose the inner native window.
        _window.Dispose()
    End Sub

#End Region
End Class

''' 
''' Event Args for the event that is fired after the hot key has been pressed.
''' 
Public Class KeyPressedEventArgs
    Inherits EventArgs
    Private _modifier As ModifierKeys
    Private _key As Keys

    Friend Sub New(modifier As ModifierKeys, key As Keys)
        _modifier = modifier
        _key = key
    End Sub

    Public ReadOnly Property Modifier() As ModifierKeys
        Get
            Return _modifier
        End Get
    End Property

    Public ReadOnly Property Key() As Keys
        Get
            Return _key
        End Get
    End Property
End Class

''' 
''' The enumeration of possible modifiers.
''' 
 _
Public Enum ModifierKeys As UInteger
    Alt = 1
    Control = 2
    Shift = 4
    Win = 8
End Enum

Form1 .vb

Задачи:

  1. Заменить 2 экземпляра Application1 ниже именем вашего приложения (его можно увидеть как корень дерева в окне обозревателя Visual Studio) .
  2. Добавить вызов на AddGlobalHotkeySupport() на этап инициализации вашего приложения.
  3. Добавить вызов на RemoveGlobalHotkeySupport() на этап завершения вашего приложения.

Код:

Public Sub AddGlobalHotkeySupport()  'TODO: call this at initialization of the application

    ' register the event that is fired after the key press.
    AddHandler hook.KeyPressed, AddressOf hook_KeyPressed

    ' register the control + alt + F12 combination as hot key.
    hook.RegisterHotKey(Application1.ModifierKeys.Control Or Application1.ModifierKeys.Alt, Keys.F12)

End Sub

Public Sub RemoveGlobalHotkeySupport()  'TODO: call this at finalization of the application
    ' unregister all registered hot keys.
    hook.Dispose()
End Sub

Private Sub hook_KeyPressed(sender As Object, e As KeyPressedEventArgs)
    ' show the keys pressed in a label.
    MsgBox(e.Modifier.ToString() + " + " + e.Key.ToString())
End Sub

8
задан Mohit 26 March 2010 в 23:24
поделиться

10 ответов

Среди классических моделей «Gang of Four» довольно много специфических для языка. Другие, такие как Visitor, действительно полезны только в объектно-ориентированной настройке. Функциональный язык вместо [Visitor] имеет fold (катаморфизм), и любой, кто пытается использовать Visitor на функциональном языке, будет рассматриваться как опасный сумасшедший. Наконец, существуют шаблоны, которые могут быть применены на любом языке, например Factory.

. Одна из причин, по которым я не являюсь большим поклонником движения шаблонов, как практикуется Гамма и др., Состоит в том, что представление о шаблоне не хватает интеллектуальной согласованности. «Любое полезное» является хорошим заявлением, но, как вы заметили, не дает большого указания относительно того, какие шаблоны могли бы по-прежнему быть полезными при изменении языка или парадигмы.

Для иллюстрации рисков, присущих классифицированию паттернов, проверьте одну из моих любимых коллекций: «Эффективные образцы практики» [k0] Smalltalk Kent Beck . Несмотря на работу «Smalltalk» в названии, многие программисты нашли эти шаблоны применимыми к таким языкам, как Java и Python.

5
ответ дан Norman Ramsey 21 August 2018 в 14:20
поделиться
  • 1
    Ни один из шаблонов GoF не зависит от языка. & quot; Все могут быть реализованы в стандартных объектно-ориентированных языках, & quot; (Предисловие стр. Xi). С другой стороны, all шаблоны GoF являются специфичными для парадигмы, следовательно, субтитры книги, Элементы многоразового объектно-ориентированного программного обеспечения . & Quot; – jaco0646 23 March 2018 в 17:09

Это должно дать прямой ответ.

С одной стороны некоторые шаблоны зависят от языка, шаблоны, такие как Factory, Strategy и Template, зависят от языковых механизмов, таких как полиморфизм и наследование.

С другой стороны, некоторые шаблоны существуют, потому что язык, который мы используем не имеет правильной функциональности (пример: шаблон посетителя используется для устранения недостатка двойной отправки на языках, таких как Java и C ++).

0
ответ дан Daniel Fath 21 August 2018 в 14:20
поделиться

Шаблоны проектирования не являются специфическими для языка, хотя некоторые шаблоны более полезны на некоторых языках, чем другие.

0
ответ дан Doug 21 August 2018 в 14:20
поделиться

Шаблоны проектирования сами по себе не являются языковыми, однако некоторые шаблоны могут быть специфичными для парадигмы, например, реализация одноэлементного шаблона в C не имеет смысла, поскольку вы можете просто написать простой старый модуль.

Однако шаблоны проектирования не являются специфичными для языка, но могут быть более полезными или иметь больше смысла в разных парадигмах (OO против структурированного и функционального)

3
ответ дан hhafez 21 August 2018 в 14:20
поделиться

Шаблоны проектирования, как правило, специфичны для конкретной парадигмы программирования. В той степени, в которой многие (большинство?) Языков поддерживают несколько парадигм, данный шаблон проектирования может применяться к совершенно разрозненным языкам.

  1. Во-первых, обратите внимание, что легкость
  2. Во-вторых, обратите внимание, что шаблон может быть настолько полезным / популярным / необходимым, чтобы язык реализовывал его напрямую, устраняя необходимость в разработчикам сделать это.

Итак, что же такое шаблон, специфичный для языка? Шаблоны реализации часто называются идиомами . См. https://softwareengineering.stackexchange.com/questions/106815/difference-between-idiom-and-design-pattern .

0
ответ дан jaco0646 21 August 2018 в 14:20
поделиться

Я думаю, что это зависит от того, какие функции языка доступны для вас, но нет, я бы не сказал, что шаблоны проектирования ограничены определенными языками.

3
ответ дан Matthew H 21 August 2018 в 14:20
поделиться

Нет, это не так. Это абстракция, которая может быть применена к объектно-ориентированным языкам в целом.

0
ответ дан McGarnagle 21 August 2018 в 14:20
поделиться
  • 1
    Другие парадигмы программирования имеют свои собственные шаблоны проектирования. Это не просто ООП. – jaco0646 23 March 2018 в 17:31

Да и нет. Некоторые шаблоны проектирования не относятся к конкретным языкам, но могут быть шаблоны проектирования, характерные для классов языков.

Например, могут быть функциональные шаблоны проектирования, характерные для функциональных языков или объектно-ориентированных шаблонов проектирования к объектно-ориентированным языкам. Некоторое перекрытие может существовать, но это не 100%.

0
ответ дан mcliedtk 21 August 2018 в 14:20
поделиться

Шаблоны зависят от языков программирования, хотя и не так сильно, как предполагает ваш вопрос. Например, Iterator является шаблоном проектирования, однако на многих языках (C ++, Java, C #) он является частью языка (ОК, библиотека классов).

Существует несколько шаблонов, которые можно назвать Object Ориентированы, т. Е. Их трудно реализовать без надлежащих классов, наследования и полиморфизма. Примеры: абстрактный завод, стратегия, шаблонный метод. Однако даже это можно сделать, например, C, если кто-то действительно хотел. Это возможно, потому что C имеет указатели на функции. Мне было бы очень сложно, хотя бы представить реализацию вышеупомянутых шаблонов на языке без OO без указателя (или эквивалентной) поддержки. Опять же, я думаю, что эти шаблоны на самом деле не имеют смысла на таком языке ...

3
ответ дан Péter Török 21 August 2018 в 14:20
поделиться
  • 1
    Я знаю кого-то, кто действительно хотел, я поддерживаю их код, когда мы говорим ... – hhafez 26 March 2010 в 23:34
  • 2
    В качестве следствия большинство шаблонов проектирования являются фактически заменой функций, отсутствующих на языке. Стратегия и команда, например, являются обходными способами из-за отсутствия первоклассных функций. Пример стратегии Ruby от Wikipedia с блоками прекрасно иллюстрирует эту точку (имея в виду, что блоки являются просто специальным синтаксисом для анонимных функций). Composite - это обходной путь для отсутствия общих функций, о чем свидетельствует пример Википедии в Common Lisp. Я подозреваю, что таким образом можно сопоставить большинство шаблонов дизайна с языковой функцией. – Zak 27 March 2010 в 01:09
  • 3
    подрывная статья Марка Домина, иллюстрирующая пункт @ Зака ​​- blog.plover.com/prog/design-patterns.html – Anurag 27 March 2010 в 02:10

Большинство шаблонов не зависят от языка. Для некоторых шаблонов и языков требуется серьезный хакер. Например, Windows COM - странная реализация составного шаблона на языке C (не C ++).

Некоторые языки, такие как VB 6.0, вызывают основные препятствия, которые нужно перепрыгнуть, чтобы реализовать некоторые шаблоны, что делает его нецелесообразным.

0
ответ дан Vlad 21 August 2018 в 14:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: