Content deleted Content added
While it's pragmatic, plenty of programs hard-code mutable data despite it being not best practice. |
CortexFiend (talk | contribs) Link suggestions feature: 3 links added. |
||
(13 intermediate revisions by 10 users not shown) | |||
Line 1:
{{Short description|Putting data in the source code of a program}}
{{redirect|Hardcoded|the video game|Hardcoded (video game)}}
{{More citations needed|date=May 2021}}
'''Hard coding''' (also '''hard-coding''' or '''hardcoding''') is the software development practice of embedding data directly into the [[source code]] of a [[computer program|program]] or other executable object, as opposed to obtaining the data from external sources or generating it at [[Run time (program lifecycle phase)|runtime]].
Hard-coded data typically can be modified only by editing the source code and [[Compiling|recompiling]] the executable, although it can be changed in [[Volatile memory|memory]] or on disk using a [[debugger]] or [[hex editor]].
Data that is hard-coded is best suited for unchanging pieces of information, such as [[physical constant]]s, [[Version number|version numbers]], and static text elements.
Soft-coded data, on the other hand, encodes arbitrary information through [[user input]], [[text files]], [[INI file]]s, HTTP server responses, configuration files, preprocessor macros, external constants, databases, [[command-line argument]]s, and is determined at runtime.
==Overview==
Hard coding requires the program's source code to be changed any time the input data or desired format changes, when it might be more convenient to the end user to change the detail by some means outside the program.<ref name="Dustin2002">{{cite book|author=Elfriede Dustin|title=Effective Software Testing: 50 Specific Ways to Improve Your Testing|url=https://books.google.com/books?id=K0qWBUOAf6IC&pg=PA188|year=2002|publisher=Addison-Wesley Professional|isbn=978-0-201-79429-8|pages=188–}}</ref>
Hard coding is often required, but can also be considered an [[anti-pattern]].<ref name="Janca2020">{{cite book|author=Tanya Janca|title=Alice and Bob Learn Application Security|url=https://books.google.com/books?id=UT4DEAAAQBAJ&pg=PA15|date=14 October 2020|publisher=Wiley|isbn=978-1-119-68740-5|pages=15–}}</ref> Programmers may not have a dynamic user interface solution for the end user worked out but must still deliver the feature or release the program. This is usually temporary but does resolve, in a short
The term "hard-coded" was initially used as an analogy to hardwiring circuits
In the context of run-time extensible [[collaborative development environment]]s such as [[Multi-user dungeon|MUD]]s,
==
==
As a [[digital rights management]] measure, software developers may
On the opposite case, a
== Fixed installation path ==
If a Windows program is programmed to assume it is always installed to C:\Program Files\Appname and someone tries to install it to a different drive for space or organizational reasons, it may fail to install or to run after installation. This problem might not be identified in the testing process, since the average user installs to the default drive and directory and testing might not include the option of changing the installation directory. However, it is advisable for programmers and developers not to fix the installation path of a program, since the default installation path depends on the operating system, OS version, and [[sysadmin]] decisions. For example, many installations of [[Microsoft Windows]] use [[Drive letter assignment#Common assignments|drive C:]] as their primary [[hard disk]], but this is not guaranteed.
There was a similar issue with [[microprocessor]]s in early computers, which [[reset (computing)|started execution]] at a fixed [[address space|address]] in memory.
==Startup disk==
Some "[[copy protection|copy-protected]]" programs look for a particular file on a [[floppy disk]] or flash drive on startup to verify that they are not unauthorized copies. If the computer is replaced by a newer machine, which doesn't have a floppy drive, the program that requires it now can't be run
This last example shows why hard
==Special folders==
Some Windows operating systems have so
===Profile path===
Some Windows programs hard code the profile path to developer-defined locations such as <code>C:\Documents and Settings\''Username''</code>. This is the path for the vast majority of [[Windows 2000]] or above, but this would cause an error if the profile is stored on a network or otherwise relocated. The proper way to get it is to call the <code>GetUserProfileDirectory</code> function or to resolve the <code>%userprofile%</code> [[environment variable]]. Another assumption that developers often make is assuming that the profile is located on a local hard disk.
===My Documents folder path===
Some Windows programs
==Solution==
Line 53 ⟶ 60:
In rare cases where the possible number of inputs is small enough, a contestant might consider using an approach that maps all possible inputs to their correct outputs. This program would be considered a hard-coded solution as opposed to an [[algorithm]]ic one (even though the hard-coded program might be the output of an algorithmic program).
==Soft coding==
'''Soft coding''' is a [[computer coding]] term that refers to obtaining a value or function from some external resource, such as [[text files]], [[INI file]]s, [[preprocessor]] [[Macro (computer science)|macros]], external constants, [[configuration file]]s, [[command-line argument]]s, databases, user input, HTTP server responses. It is the opposite of hard coding, which refers to coding values and functions in the source code.
===Programming practice===
Avoiding hard coding of commonly altered values is good programming practice. Users of the software should be able to customize it to their needs, within reason, without having to edit the program's source code. Similarly, careful programmers avoid [[Magic number (programming)#Unnamed numerical constants|magic numbers]] in their code to improve its readability and assist maintenance. These practices are generally not referred to as ''soft coding''.
The term is generally used where soft coding becomes an [[anti-pattern]]. Abstracting too many values and features can introduce more complexity and maintenance issues than would be experienced with changing the code when required. Soft coding, in this sense, was featured in an article on [[The Daily WTF]].<ref>[http://thedailywtf.com/Articles/Soft_Coding.aspx Softcoding] from [[The Daily WTF]]</ref>
===Potential problems===
At the extreme end, soft-coded programs develop their own poorly designed and implemented scripting languages, and configuration files that require advanced programming skills to edit. This can lead to the production of utilities to assist in configuring the original program, and these utilities often end up being soft coded themselves.
The boundary between proper configurability and problematic soft-coding changes with the style and nature of a program. Closed-source programs must be very configurable<!-- but generally aren't! -->, as the end user does not have access to the source to make any changes. In-house software and software with limited distribution can be less configurable, as distributing altered copies is simpler. Custom-built web applications are often best with limited configurability, as altering the scripts is seldom any harder than altering a configuration file. <!-- Witness the scores of CMS systems that are so much harder to work with than a bunch of html files in www/data! -->
To avoid soft coding, consider the value to the end user of any additional flexibility you provide, and compare it with the increased complexity and related ongoing maintenance costs the added configurability involves.
===Achieving flexibility===
Several legitimate design patterns exist for achieving the flexibility that soft coding attempts to provide. An application requiring more flexibility than is appropriate for a configuration file may benefit from the incorporation of a [[scripting language]]. In many cases, the appropriate design is a [[___domain-specific language]] integrated into an established scripting language. Another approach is to move most of an application's functionality into a library, providing an API for writing-related applications quickly.
==See also==
* [[Closed-source software]]▼
* [[Firmware]]
▲*[[Closed-source software]]
* [[
* [[Rule of least power]]
* [[Self-modifying code]]
==References==
|