web-dev-qa-db-fra.com

Pourquoi la programmation impérative est-elle préférée sur la programmation fonctionnelle?

Contexte : Je suis le promoteur de la programmation fonctionnelle qui travaille dans un magasin VB.NET où le modèle mental dominant est une programmation impérative. Être que les fondements de notre système sont des winforms, je peux comprendre que nous n'allons pas être entièrement éloignés de la programmation impérative, mais j'essaie toujours d'utiliser FP (principalement via Linq) dans la mesure du possible parce que je crois dans ses mérites.

Arguments et contre-arguments contre la FP

  1. On pourrait remarquer que Linq fluide est moins efficace que son homologue impératif en ce que ce style traite une séquence à une autre séquence et répète cela. Généralement, il va prendre quelques passes de plus que l'approche impérative qui peut être mieux optimisée pour éviter les passes répétées sur une séquence. Pour cette raison, le responsable ne pouvait pas comprendre pourquoi je choisirais une approche fonctionnelle qui est clairement "moins efficace".

    • contre-argument : J'ai fait valoir que, même s'il est parfois moins efficace en termes de cycles de la CPU, que je sentais qu'il est plus humainement intelligible et facile à suivre depuis Chaque ligne ne fait qu'une chose sur sa passe sur la séquence. Pour moi, cela ressemble à avoir une chaîne de montage où chaque personne de sa station n'a qu'un seul travail à faire. Je pense que le commerce négligeable de l'efficacité est recompanté par le code dont les préoccupations sont soigneusement séparées.
  2. L'argument suivant contre FP== J'entends dans ma boutique est qu'il est plus difficile de déboguer - ce qui est vrai. Il n'est pas facile de passer sur le code Linq. Et je dois parfois faire une méthode chaîne afin de mieux suivre et disséquer les problèmes que je ne peux pas repérer immédiatement.

    • _Counter-Argument: Pour la plupart, même si je n'ai pas de problème avec cela parce que je pense que le style fonctionnel est plus déclaratif dans la façon dont il se lit et lorsqu'une erreur est lancée dans une chaîne fonctionnelle, je peux généralement repérer le problème immédiatement.

ma question

J'ai essayé de promouvoir le style fonctionnel dans notre magasin et je n'ai pas envie de faire la tête. J'ai fait les deux styles de programmation et n'avez que récemment dabonné à Haskell. Malgré des années d'expérience impérative, maintenant que je fais une utilisation de routine de FP à JavaScript, il est cultivé sur moi. Il sonne une note de justesse dans mon cœur quand je le comparais à ce que je pourrais ont fait si je suis coincé à un style impératif. J'ai recyclé mon cerveau vers la pensée fonctionnelle, vers la composition fonctionnelle.

Ce que je ne peux pas comprendre, c'est que c'est difficile de convaincre les autres des mérites de FP.

Par exemple, les développeurs de ma boutique utilisent Linq, mais je pense qu'ils l'utilisent généralement dans le contexte de traiter des données de domaine. Je l'utilise de manière plus générale et préférez-la à tout moment avec des séquences/listes ou des structures de données persistantes. Je n'ai pas pu convaincre mes coéquipiers d'élargir leur utilisation de Linq.

Ce que j'essaie de comprendre est ce que fait un développeur de ne pas aimer FP.

J'aimerais voir une réponse de quelqu'un qui a une bonne expérience avec FP mais a décidé en faveur du style impératif. Qu'est-ce qui a conduit la décision de rester impératif au lieu d'utiliser fonctionnaire au lieu d'utiliser fonctionnaire?


Voici un exemple supplémentaire mettant en évidence les différences entre la programmation impérative et fonctionnelle.

J'ai écrit la méthode SelectedRows de notre grille à Linq en tant que telle:

Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows
    Get
        Return Me.ugrBase.Selected.Rows.
            OfType(Of Infragistics.Win.UltraWinGrid.UltraGridRow)().
            Select(Function(ugr) ugr.ListObject).
            OfType(Of DataRowView)().
            Select(Function(drv) drv.Row).
            ToArray
    End Get

Cependant, ce style de code rend certains de nos développeurs mal à l'aise et notre premier plomb la réécrit à plus familier:

Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows
    Get
        Dim plstRows As New List(Of DataRow)
        For Each bugrLoop As Infragistics.Win.UltraWinGrid.UltraGridRow In Me.ugrBase.Selected.Rows
            If bugrLoop.ListObject IsNot Nothing Then
                plstRows.Add(CType(bugrLoop.ListObject, DataRowView).Row)
            End If
        Next
        Return plstRows.ToArray()
    End Get
13
Mario T. Lanza

La programmation fonctionnelle est simplement Trop compliqué pour les programmeurs inexpérimentés. L'une des illustrations est celle-ci , où les étudiants ont déclaré que le désordre de 30 locum était plus facile et plus intuitif de comprendre par rapport aux quatre lignes FP analogique.

(Ceci est la version originale du FP exemple, car la réponse dans le lien a été modifiée plus récemment pour le rendre légèrement plus facile à lire.)

return this.Data.Products
    .Where(c => c.IsEnabled)
    .GroupBy(c => c.Category)
    .Select(c => new PricesPerCategory(category: c.Key, minimum: c.Min(d => d.Price), maximum: c.Max(d => d.Price)));

La programmation fonctionnelle nécessite une manière différente de penser à la manière dont nous codirons et la manière dont ce code est exécuté. C'est rarement la façon dont les étudiants sont racontés au collège, Et une fois que de mauvaises habitudes prises, il est difficile de les changer.

La programmation fonctionnelle a également ses propres caractéristiques spécifiques qui peuvent sembler risquées dans les mains des débutants. L'évaluation paresseuse est l'une d'entre elles et cela peut prendre des mois avant que l'on commence à comprendre pourquoi l'évaluation paresseuse est une excellente caractéristique, et non une gêne.

C'est aussi pourquoi tant de débutants commencent à programmer avec des langues telles que PHP et pas de langues comme Haskell.

11
Arseni Mourzenko